提问者:小点点

在Django中,如何将URL包含在app_name中,而不必与app name反向使用?


我有一个allauth模板的自定义目录。 我需要一些自定义的URLPatterns,也不需要一些默认视图。 我想从粘接整个Allauth开始,然后更改以后需要的内容。

我的主应用config/urls.py文件

from django.urls import include, path


urlpatterns = [
    path("account/", include("users.urls")),
]

用户应用程序:

用户/urls.py

app_name = "users"

urlpatterns = [
    path("login/", allauth_views.login, name="account_login"),
    path("logout/", allauth_views.logout, name="account_logout"),
    path("signup/", allauth_views.signup, name="account_signup"),
]

使用这种基本设置,如果我转到/account/login,它将正确地路由到所需的视图,但它是在users应用程序中用app_name=“users”定义的,因此,我必须用reverse(users:account_login)在其他视图中访问它。 问题是AlLauthLoginView具有此方法

    def get_context_data(self, **kwargs):
        ret = super(LoginView, self).get_context_data(**kwargs)
        signup_url = passthrough_next_redirect_url(self.request,
                                                   reverse("account_signup"),
                                                   self.redirect_field_name)
        redirect_field_value = get_request_param(self.request,
                                                 self.redirect_field_name)
        site = get_current_site(self.request)

        ret.update({"signup_url": signup_url,
                    "site": site,
                    "redirect_field_name": self.redirect_field_name,
                    "redirect_field_value": redirect_field_value})
        return ret

它在reverse(“account_signup”)上执行查找,但Django丢失并抛出Django.urls.exceptions.noReverseMatch

两种解决方案:

  1. 如果我在主URL文件中设置了这些AlLauthurlpatterns,它可以正常工作,但我希望保持该文件较小,并在Users应用程序中定义AlLauthURL.
  2. 如果我没有在users/urls.py中定义app_name,它可以正常工作,但我希望它用于其他路由。 我认为添加app_name是一种很好的做法。 我本来可以为Allauth创建另一个没有应用程序名称的应用程序,但是我会在两个应用程序中包含用户的东西。

这些都不能让我满意。

我想要的是:

我是否可以在没有命名空间的情况下包括它们? 我尝试了path(“account/”,include(“users.urls”,namespace=none)),但没有成功。


共1个答案

匿名用户

我没在想。。。 我可以在users/urls.py中保留我的自定义usersURL,并在usersapp中创建另一个URL文件,如users/allauth_urls.py,这样就可以正常工作。

然后,用

    path("account/", include("users.allauth_urls")),

一切都按计划进行。