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

Django报错NameError: name 'password_reset_done'未定义,求解决方法

解决Django中NameError: name 'password_reset_done' is not defined的问题

我一眼就看出你碰到的是Django版本迭代带来的视图类型不兼容问题——旧教程用的是函数式密码重置视图,而你现在导入的是新版本的类视图,但在urls配置里还是沿用了旧函数名的写法,所以才会出现“未定义”的错误。下面我一步步帮你修正:

1. 修正accounts/urls.py的导入与视图调用

你已经正确导入了PasswordResetDoneView和PasswordResetConfirmView这两个类视图,但没有按照类视图的规则使用它们:类视图必须通过as_view()方法转换成可用于url配置的视图函数,同时你错误地使用了旧函数名password_reset_done和password_reset_confirm。另外,Django 2.0+推荐用path配合路径转换器,或者用re_path来编写正则路径,旧的正则写法直接放在path里是不生效的。

修改后的完整accounts/urls.py代码如下:

from django.urls import path, re_path  # 新增re_path用于正则匹配
from . import views
from django.contrib.auth.views import (
    LoginView, LogoutView, PasswordResetView, 
    PasswordResetDoneView, PasswordResetConfirmView,
)

urlpatterns = [
    path('', views.home),
    # 顺便提一句:旧的login、logout函数视图已经被废弃,建议换成类视图写法
    path('login/', LoginView.as_view(template_name='contas/login.html'), name='login'),
    path('logout/', LogoutView.as_view(template_name='contas/logout.html'), name='logout'),
    path('register/', views.register, name='register'),
    path('perfil/', views.view_perfil, name='view_perfil'),
    path('perfil/edit/', views.edit_perfil, name='edit_perfil'),
    path('trocar-password/', views.trocar_password, name='trocar_password'),
    # 替换旧的password_reset函数为PasswordResetView类视图
    path('reset-password/', PasswordResetView.as_view(), name='reset_password'),
    # 用as_view()调用类视图,替代未定义的password_reset_done
    path('reset-password/done/', PasswordResetDoneView.as_view(), name='password_reset_done'),
    # 用re_path处理正则路径,或者改用path的转换器写法(二选一即可)
    re_path(r'reset-password/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/', 
            PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    # 如果你更习惯path的写法,可以把上面的re_path换成下面这行:
    # path('reset-password/confirm/<uidb64>/<token>/', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
]

2. 问题根源拆解

  • 旧版Django(1.11及更早)的密码重置相关视图都是函数类型,比如password_reset_done、password_reset_confirm;但从Django 2.0开始,这些视图全部重构为基于类的视图,也就是你导入的PasswordResetDoneView、PasswordResetConfirmView。你导入了类视图却用旧函数名调用,Python自然找不到这个变量,所以抛出NameError。
  • 另外你原来用的login、logout也是旧函数视图,现在官方已经标记为废弃,建议同步换成类视图写法,避免后续版本升级出现更多问题。

3. 额外注意事项

  • 类视图默认会去registration目录下查找模板文件(比如password_reset_done.html),如果你的模板放在contas目录下,可以在as_view()里手动指定模板路径,比如:
    path('reset-password/done/', PasswordResetDoneView.as_view(template_name='contas/password_reset_done.html'), name='password_reset_done'),
    
  • 完整的密码重置流程通常还需要PasswordResetCompleteView,如果你的项目需要完成整个重置流程,可以把它也导入并配置到urls里。

内容的提问来源于stack exchange,提问作者Lucas Cyrne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:28:20