Django出现NoReverseMatch错误:无法匹配password_reset_done视图
解决Django中password_reset_done反向匹配失败的问题
问题原因
出现django.urls.exceptions.NoReverseMatch: Reverse for 'password_reset_done' not found错误,核心是你给django.contrib.auth.urls添加了namespace='accounts'命名空间,但Django内置的密码重置相关视图、模板在反向解析URL时,没有带上这个命名空间前缀,导致找不到对应路由。另外你的urls.py还有语法错误:导入了welcome_view却用views.welcome_view调用,这会触发views未定义的报错,得先修正。
修复步骤
1. 修正URL配置的语法错误
先把welcome_view的调用改对,同时确保导入include模块:
from django.contrib import admin from django.urls import path, include from app1.views import profile, welcome_view urlpatterns = [ path('accounts/', include(('django.contrib.auth.urls', 'auth'), namespace='accounts')), path('accounts/profile/', profile, name='profile'), path('admin/', admin.site.urls), path('', welcome_view, name="welcome_view"), # 移除前面的views. ]
2. 让模板适配命名空间(保留命名空间时用)
如果要保留accounts命名空间,需要修改密码重置相关模板里的URL反向解析:
- 打开
password_reset.html模板,将表单的action改为带命名空间的URL:<form action="{% url 'accounts:password_reset' %}" method="post"> {% csrf_token %} <!-- 表单内容 --> </form> - 所有涉及密码重置流程的URL反向都要加上
accounts:前缀,比如password_reset_done要写成{% url 'accounts:password_reset_done' %}
3. 可选:移除命名空间(简化方案)
如果不需要命名空间,直接简化URL配置即可,Django默认模板无需修改就能正常工作:
path('accounts/', include('django.contrib.auth.urls')),
此时反向解析直接用{% url 'password_reset_done' %}即可。
验证
修改完成后重启Django服务,测试密码重置流程:点击“忘记密码或用户名”进入password_reset页面,输入邮箱提交后,就能正常跳转到password_reset_done页面。
内容的提问来源于stack exchange,提问作者Kevin Gopito
相关产品推荐
相关产品推荐

