如何使用 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
.
两种解决方案:
- 如果我在我的主 urls 文件中设置那些
allauth
urlpatterns 它可以正常工作,但我想保持这个文件小并在我的 users
应用程序中定义 allauth
urls。
- 如果我没有在我的
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")),
一切如期进行。
我有一个用于 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
.
两种解决方案:
- 如果我在我的主 urls 文件中设置那些
allauth
urlpatterns 它可以正常工作,但我想保持这个文件小并在我的users
应用程序中定义allauth
urls。 - 如果我没有在我的
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")),
一切如期进行。