如何使用 app_name 包含 url 而不必在 Django 中对应用程序名称使用 reverse?

How to include urls with app_name without having to use reverse with app name in Django?

我有一个用于 allauth 模板的自定义目录。我需要一些自定义 urlpatterns 并且不需要一些默认视图。我想从粘合整个 allauth 开始,然后更改我以后需要的东西。

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

from django.urls import include, path


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

用户应用程序:

users/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) 在其他视图中访问它。问题是 allauth LoginView 有这个方法

    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. 如果我在我的主 urls 文件中设置那些 allauth urlpatterns 它可以正常工作,但我想保持这个文件小并在我的 users 应用程序中定义 allauth urls。
  2. 如果我没有在我的 users/urls.py 中定义 app_name 它可以正常工作,但我希望它用于其他路线。我认为添加 app_name 是一种很好的做法。我本可以为 allauth 创建另一个没有应用程序名称的应用程序,但我会在两个应用程序中添加用户内容。

None个让我满意

我想要的:

我可以在没有命名空间的情况下以某种方式 include 它们吗?我试过 path("account/", include("users.urls", namespace=None)) 没有任何运气。

我没想到...我可以在 users/urls.py 中使用应用程序名称保留我的自定义 users 网址,并在 [=11= 中创建另一个网址文件,如 users/allauth_urls.py ] 应用程序和一切正常工作。

然后,

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

一切如期进行。