Django4.0密码重置报password_reset_confirm反向解析未找到错误
报错原因
- 你给Core应用配置了
app_name='Core'路由命名空间,该应用下所有路由必须带Core:前缀才能被反向解析,但Django 4.x内置PasswordResetView默认反向解析不带命名空间的password_reset_confirm路由名来生成重置邮件的验证链接,匹配不到现有路由就抛出该错误。 - 现有密码重置路由配置不全,且
PasswordResetConfirmView跳转逻辑错误:这个视图是用户输入新密码的页面,提交成功后应该跳转到重置完成提示页,当前配置把success_url指向视图自身,逻辑不通;同时缺少「重置邮件发送成功提示页」「密码重置完成提示页」两个必要路由,就算解决反向解析问题,后续流程也会报错。 - 贴出的代码本身存在语法问题:多行导入视图类时没有用括号包裹,urlpatterns列表未闭合,运行时会直接触发语法错误。
修复方法
- 修正基础语法问题,补全缺失的视图导入,调整所有密码重置相关路由的配置,给每个内置视图显式指定带命名空间的跳转地址:
from django.urls import path, reverse_lazy from Core import views from django.contrib.auth.views import ( PasswordChangeView, PasswordResetView, PasswordChangeDoneView, PasswordResetConfirmView, PasswordResetDoneView, PasswordResetCompleteView ) from .forms import MyChangePasswordForm, MyPasswordResetForm app_name ='Core' urlpatterns = [ path('',views.home, name='home'), path('signup/',views.SignupView.as_view(),name='signup'), path('login/',views.LoginView.as_view(),name='login'), path('logout/', views.LogoutView.as_view(), name='logout'), path('change-password/', PasswordChangeView.as_view( template_name='Core/change-password.html', form_class=MyChangePasswordForm, success_url=reverse_lazy('Core:password_change_done') ), name='change-password'), path('password-change-done/', PasswordChangeDoneView.as_view( template_name='Core/password_change_done.html' ), name='password_change_done'), path('reset-password/', PasswordResetView.as_view( template_name='Core/password-reset.html', form_class=MyPasswordResetForm, success_url=reverse_lazy('Core:password_reset_done'), email_template_name='Core/password_reset_email.html' ), name='reset-password'), path('reset-password/done/', PasswordResetDoneView.as_view( template_name='Core/password_reset_done.html' ), name='password_reset_done'), path('password-reset-confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view( template_name='Core/password_reset_confirm.html', success_url=reverse_lazy('Core:password_reset_complete') ), name='password_reset_confirm'), path('reset-password/complete/', PasswordResetCompleteView.as_view( template_name='Core/password_reset_complete.html' ), name='password_reset_complete'), ]
- 新建自定义密码重置邮件模板
Core/password_reset_email.html,手动指定带命名空间的路由生成重置链接,替换默认模板不带命名空间的解析逻辑,模板参考内容:
你收到这封邮件是因为有人请求重置绑定账号{{ email }}的密码,点击下方链接完成重置: {{ protocol }}://{{ domain }}{% url 'Core:password_reset_confirm' uidb64=uid token=token %} 如果不是你本人发起的重置请求,直接忽略这封邮件即可,你的密码不会发生变更。
- 补全剩余三个模板文件即可正常使用功能:
Core/password_reset_done.html:提示用户重置邮件已发送,引导用户查收邮箱Core/password_reset_confirm.html:渲染新密码输入表单Core/password_reset_complete.html:提示密码重置成功,可添加跳转登录页的入口
如果不想自定义邮件模板,也可以把4个密码重置相关路由移到项目根
urls.py中(不放在带app_name的子应用路由下),路由名不使用命名空间,即可直接复用Django默认的邮件模板,但自定义模板的方式更符合路由隔离的开发规范,灵活度更高。
内容的提问来源于stack exchange,提问作者Mohammad Ishak
相关产品推荐
相关产品推荐

