对于django.contrib.auth.views.password_reset_confirm,Django没有反向

时间:2014-09-24 23:30:20

标签: django django-authentication

我尝试使用Django内置的身份验证视图来重置密码,但是我无法弄清楚为什么应用程序会针对内置身份验证视图进行监控password_reset_confirm 。知道如何解决这个问题,或者至少调试一下吗?暂时坚持这个问题。

模板错误

NoReverseMatch at /accounts/password/reset/

Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb64': u'xxxxxxxxxxxxxxxxxxxxxxx', u'token': u'xxxxxxxxxxxxxxxxx'}' not found.


Error during template rendering

In template /home/user/Envs/local/lib/python2.7/site-packages/django/contrib/admin/templates/registration/password_reset_email.html, error at line 6

Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{u'uidb64': u'xxxxxxxxxxxxxxxxxxxxxxx', u'token': u'xxxxxxxxxxxxxxxx'}' not found.

----> {{ protocol }}://{{ domain }}{% url 'django.contrib.auth.views.password_reset_confirm' uidb64=uid token=token %} <---- Template errors here

urls.py

from django.contrib.auth.views import login, password_reset, password_reset_confirm, password_reset_done, password_reset_complete

urlpatterns = patterns('userProfile.views',
    url(r'^password/reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$',
        password_reset_confirm,
        name='password_reset_confirm'),
...)

尝试解决方案

根据约瑟夫的建议,修改管理模板可以解决问题。但是,为什么我不能反转内置的auth视图???

{{ protocol }}://{{ domain }}{% url 'userProfile:password_reset_confirm' uidb64=uid token=token %}

1 个答案:

答案 0 :(得分:3)

我相信,既然您已经为URL映射了一个名称,那么您可以在逆转中使用该名称:

{% url 'password_reset_confirm' uid token %}

假设uidtoken在上下文中。

您可以按照自己喜欢的方式进行操作:

urlpatterns = patterns(
    'django.contrib.auth.views',
    (r'^password/reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$', 'password_reset_confirm'),
)

一旦你定义了一个名字,我相信你必须使用它来反转它。由于您的URL不是字符串,字符串但字符串,函数,字符串的元组,因此您不能反转视图函数的名称,而是取决于URL模式的名称(最后一个字符串)。

我可能会在这里弄错。

[第二次更新] patterns中的第一个参数是前缀。您可以尝试这样做:

from django.contrib.auth.views import login, password_reset, password_reset_confirm, password_reset_done, password_reset_complete

urlpatterns = patterns('',
    url(r'^password/reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$','django.contrib.auth.views.password_reset_confirm'),
    url(r'...other_app_urls_here','other_view'),
...)

或者如果你真的想保留你的应用的前缀,只需单独添加模式:

from django.contrib.auth.views import login, password_reset, password_reset_confirm, password_reset_done, password_reset_complete

urlpatterns = patterns('',
    url(r'^password/reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>.+)/$','django.contrib.auth.views.password_reset_confirm'),
)

urlpatterns += patterns('userProfile.views',
    ...userProfile_urls_here...
)

这两个解决方案中的任何一个都应该允许您反转整个内置视图。

文档链接: https://docs.djangoproject.com/en/1.7/ref/urls/#django.conf.urls.patterns https://docs.djangoproject.com/en/1.7/topics/http/urls/#urlpatterns-view-prefix https://docs.djangoproject.com/en/1.7/topics/http/urls/#multiple-view-prefixes