You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django访问/reset-password/遇NoReverseMatch:找不到password_reset_done

解决Django中password_reset视图的NoReverseMatch错误:找不到'password_reset_done'

我帮你分析下这个问题:你访问/reset-password/时触发的NoReverseMatch错误,核心原因是Django自带的password_reset视图默认会尝试反向解析名为password_reset_done的URL,但你的URL配置里要么没给这个URL设置正确的name属性,要么命名不匹配。而直接访问/reset-password/done/正常,说明视图本身是没问题的,问题出在URL的命名关联上。

下面是具体的解决步骤:


1. 确保password_reset_done的URL配置带有正确的name

你已经导入了password_reset_done视图,现在需要在urlpatterns里给它指定精确的name='password_reset_done'——这是password_reset视图默认会查找的名称。参考下面的配置示例:

from django.conf.urls import url
from account import views
from django.contrib.auth.views import (
    login, logout, password_reset, password_reset_done,
    password_reset_confirm, password_reset_complete
)

urlpatterns = [
    # 密码重置请求页面
    url(r'^reset-password/$', password_reset, name='password_reset'),
    # 关键:给password_reset_done的URL设置name='password_reset_done'
    url(r'^reset-password/done/$', password_reset_done, name='password_reset_done'),
    # 其他密码重置相关URL也要正确设置name
    url(r'^reset-password/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        password_reset_confirm, name='password_reset_confirm'),
    url(r'^reset-password/complete/$', password_reset_complete, name='password_reset_complete'),
    # 你的其他URL...
]

2. 检查是否手动覆盖了password_reset的跳转参数

如果你在配置password_reset时手动指定了success_url或post_reset_redirect,要确保这个参数指向的是有效的URL或正确的URL名称。比如用reverse_lazy来生成正确的跳转路径:

# Django <2.0 用这个导入
from django.core.urlresolvers import reverse_lazy
# Django >=2.0 换成这个
# from django.urls import reverse_lazy

url(r'^reset-password/$', password_reset, {
    'post_reset_redirect': reverse_lazy('password_reset_done'),
}, name='password_reset'),

不过一般情况下不需要手动设置这个参数,只要password_reset_done的URL名称正确,password_reset视图会自动找到它。

3. 如果用了URL命名空间,要带上命名前缀

如果你的account app的URL是通过主urls.py的include导入并设置了命名空间(比如namespace='account'),那需要在跳转时带上命名空间:

# 主urls.py的配置示例
url(r'^account/', include('account.urls', namespace='account')),

# 然后在account的urls.py里,给password_reset设置post_reset_redirect时要加命名空间
url(r'^reset-password/$', password_reset, {
    'post_reset_redirect': reverse_lazy('account:password_reset_done'),
}, name='password_reset'),

同时如果模板里有相关的跳转链接,也要写成{% url 'account:password_reset_done' %}。


完成配置后,重启你的Django服务器,再访问http://localhost:8000/reset-password/应该就不会再出现这个错误了。如果还是有问题,可以运行python manage.py show_urls(需要先安装django-extensions)来查看所有已注册的URL及其名称,确认password_reset_done确实存在且名称正确。

内容的提问来源于stack exchange,提问作者Mahmood Al Rayhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:52:56