Django3如何将应用子模块的urls配置引入主urls.py文件
问题原因
反向匹配错误核心是Django内置的auth视图默认会查找全局无命名空间的url名称,你将相关路由放在了指定了app_name='accounts.passwords'的子urls模块中,相当于给这组路由加了accounts.passwords的命名空间,内置视图找不到对应名称的路由就会报错。
直接把路由写在主urls.py中可以正常运行,是因为主urls的路由默认没有命名空间,和内置视图的查找逻辑匹配。另外你不需要将accounts.passwords单独加入INSTALLED_APPS,只要父应用accounts在应用列表中即可。
解决方案
两种常用处理方法按需选择即可:
方法1:为每个内置auth视图指定带命名空间的跳转地址
在accounts/passwords/urls.py中导入reverse_lazy,给每个需要跳转的视图手动指定success_url为带命名空间的路由,修改后的代码如下:
from django.urls import path, reverse_lazy from django.contrib.auth import views as auth_views app_name='accounts.passwords' urlpatterns = [ path('password/change/', auth_views.PasswordChangeView.as_view( success_url = reverse_lazy('accounts.passwords:password_change_done') ), name='password_change'), path('password/change/done/', auth_views.PasswordChangeDoneView.as_view(), name='password_change_done'), path('password/reset/', auth_views.PasswordResetView.as_view( success_url = reverse_lazy('accounts.passwords:password_reset_done') ), name='password_reset'), path('password/reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'), path('password/reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view( success_url = reverse_lazy('accounts.passwords:password_reset_complete') ), name='password_reset_confirm'), path('password/reset/complete/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), ]
同时你存放在templates/registration下的自定义模板中,所有调用{% url %}的地方也要加上命名空间前缀,比如把{% url 'password_reset_done' %}改成{% url 'accounts.passwords:password_reset_done' %}。
方法2:移除子urls的命名空间配置
如果你不需要这组路由使用独立的命名空间,可以直接删掉accounts/passwords/urls.py中的app_name='accounts.passwords'配置,这样路由名称就会变成全局可查找的,和内置视图的逻辑匹配,不需要修改其他代码即可正常运行。
内容的提问来源于stack exchange,提问作者Ystan
相关产品推荐
相关产品推荐

