在URL中添加命名空间会导致甚至不应该出现的错误

时间:2015-07-24 12:16:30

标签: python django

我有一个非常奇怪的问题,我真的不明白。

我正在使用django-registragion-redux以及该软件包提供的几乎未更改的login.html模板。

我的urls.py文件如下:

urlpatterns = [
    url(r'^', include('main_site.urls', namespace='main'), name='main'),
    url(r'^accounts/', include('registration.backends.default.urls')),
    url(r'^admin/', include(admin.site.urls))
]

模板templates/registration/login.html包含两条相关的行以及填充符:

<p>{% trans "Not a member?" %} <a href="{% url 'registration_register' %}">{% trans "Register now!" %}</a>.</p>
<p>{% trans "Forgot your password?" %} <a href="{% url 'auth_password_reset' %}">{% trans "Reset it" %}</a>.</p>

使用这些设置,一切都很好。我转到http://127.0.0.1:8000/accounts/login/,基本站点就在那里,链接设置正确。

但是,我希望有一个更干净的代码,并建议使用命名空间。好的,没问题。我将我的网址更改为

urlpatterns = [
    url(r'^', include('main_site.urls', namespace='main'), name='main'),
    url(r'^accounts/', include('registration.backends.default.urls', namespace='accounts')),
    url(r'^admin/', include(admin.site.urls))
]

我将模板更改为

<p>{% trans "Not a member?" %} <a href="{% url 'accounts:registration_register' %}">{% trans "Register now!" %}</a>.</p>
<p>{% trans "Forgot your password?" %} <a href="{% url 'accounts:auth_password_reset' %}">{% trans "Reset it" %}</a>.</p>

现在,当我打开页面http://127.0.0.1:8000/accounts/login/时,收到以下错误消息:

NoReverseMatch at /accounts/login/
Reverse for 'auth_password_reset_done' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
Request Method: GET
Request URL:    http://127.0.0.1:8000/accounts/login/
Django Version: 1.8.3
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'auth_password_reset_done' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

现在这很奇怪有两个原因:

  1. 命名空间显然有效。 accounts:registration_register标记得到了很好的反转。如果我只保留文件中的第二段,则没有错误。
  2. 该错误指出无法找到auth_password_reset_done的反向,但模板中没有提及 auth_password_reset_done!实际上发生了错误,试图撤消auth_password_reset

1 个答案:

答案 0 :(得分:2)

问题在于django-registration-redux会反转registration/auth_urls中的某些网址。由于没有使用命名空间,因此反转URL失败。

有两种可能的解决方法:

  • 而不是urls.py中的auth_urls.py(以及隐含django-registration-redux},请将它们复制到您的项目中并修复对reverse_lazy的调用

  • fork django-registration-redux,解决问题并提交拉取请求