解决Django中/polls/reset-password/路径的NoReverseMatch错误
我之前也踩过这个坑,大概率是Django内置的password_reset视图找不到password_reset_done的路由导致的,下面给你详细的排查和解决步骤:
1. 给password_reset视图显式指定跳转目标
Django的password_reset内置视图默认会尝试反向解析password_reset_done这个URL名称,但如果你的路由是在应用级别的urls.py(比如你的polls应用)里定义的,且项目主urls.py给polls加了命名空间,内置视图会找不到不带命名空间的password_reset_done。
你需要修改polls/urls.py里的reset-password路由,显式传递post_reset_redirect参数:
url(r'^reset-password/$', password_reset, { # 如果你用了自定义的密码重置模板,加上这行;没有的话可以省略 'template_name': 'polls/password_reset.html', # 没有命名空间就写'password_reset_done',有命名空间要写成'polls:password_reset_done' 'post_reset_redirect': 'password_reset_done' }, name='reset_password'),
2. 检查项目主urls.py的命名空间配置
打开项目根目录的urls.py,确认你包含polls路由的方式:
如果是带命名空间的配置:
from django.conf.urls import include, url urlpatterns = [ url(r'^polls/', include('polls.urls', namespace='polls')), # ...其他路由 ]那上面的
post_reset_redirect必须改成'polls:password_reset_done',后续的password_reset_confirm、password_reset_complete也要统一使用命名空间格式。如果没有加命名空间,只要确保
password_reset_done的name和你配置的一致(你的代码里已经正确设置了)即可。
3. 检查自定义模板的URL调用(如果有)
如果你自己写了password_reset.html模板,里面的表单跳转或链接要正确使用URL名称:
- 无命名空间:
{% url 'password_reset_done' %} - 有命名空间:
{% url 'polls:password_reset_done' %}
4. 补充完整密码重置的后续路由
你目前只配置了前两步的路由,后续的重置确认和完成页面也需要补上,不然重置邮件里的链接会报错,完整配置参考:
# 密码重置确认路由 url(r'^reset-password/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', password_reset_confirm, {'post_reset_redirect': 'password_reset_complete'}, name='password_reset_confirm'), # 密码重置完成路由 url(r'^reset-password/complete/$', password_reset_complete, {'template_name': 'polls/password_reset_complete.html'}, name='password_reset_complete'),
按照上面的步骤调整后,应该就能解决NoReverseMatch的问题了。
内容的提问来源于stack exchange,提问作者arpan mahatra

