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

Django新手技术咨询:如何为PasswordTokenCheckAPIView添加密码重置输入模板并解决PasswordResetConfirmView跳转错误

解决Django PasswordResetConfirmView反向解析password_reset_complete失败的问题

你的错误根源很清晰:Django自带的PasswordResetConfirmView默认在密码重置成功后,会尝试通过下划线分隔的password_reset_complete这个URL名称做反向解析,但你在URL配置里给PasswordResetCompleteView设置的名称是中划线分隔的password-reset-complete,两者不匹配,所以抛出了找不到路由的错误。

下面给你两种可行的解决办法:

方法一:修改URL名称为Django默认格式

直接把PasswordResetCompleteView的URL名称改成Django默认的下划线格式,这样不需要额外配置视图参数:

# urls.py
urlpatterns=[
    # ... 其他路由保持不变
    path('password-reset/<uidb64>/<token>/',auth_view.PasswordResetConfirmView.as_view(),name='password-reset'),
    # 把name改成下划线的password_reset_complete
    path('password_reset_complete/',auth_view.PasswordResetCompleteView.as_view(),name='password_reset_complete')
]

方法二:自定义PasswordResetConfirmView的成功跳转URL

如果你想保留现有中划线的URL名称,可以通过success_url参数明确指定跳转目标,这里要用到reverse_lazy(因为URL加载时可能还没完成解析):

from django.urls import reverse_lazy
# ... 其他导入保持不变

urlpatterns=[
    # ... 其他路由保持不变
    path('password-reset/<uidb64>/<token>/',auth_view.PasswordResetConfirmView.as_view(
        success_url=reverse_lazy('password-reset-complete')
    ),name='password-reset'),
    path('password_reset_complete/',auth_view.PasswordResetCompleteView.as_view(),name='password-reset-complete')
]

额外注意事项

  1. 模板文件:Django的这两个重置视图默认会去registration目录下找模板,比如password_reset_confirm.html和password_reset_complete.html,你需要确保这些模板存在于你的项目模板目录中,或者通过template_name参数指定自定义模板路径,比如:
auth_view.PasswordResetConfirmView.as_view(
    template_name='your_app/custom_reset_confirm.html',
    success_url=reverse_lazy('password-reset-complete')
)
  1. 结合原有DRF接口:如果你想继续使用自己写的SetNewPasswordAPIView处理密码重置逻辑,而不是用Django自带的视图,可以修改password_reset_confirm.html模板,让表单提交到你的DRF接口URL:
<!-- 在password_reset_confirm.html中 -->
<form method="POST" action="{% url 'password-reset-complete' %}">
    {% csrf_token %}
    <!-- 注意:你的SetNewPasswordAPIView当前是patch方法,可能需要改成POST或者添加POST处理逻辑 -->
    <input type="password" name="password" placeholder="新密码">
    <input type="password" name="password_confirm" placeholder="确认密码">
    <!-- 隐藏字段传递uidb64和token,供API验证身份 -->
    <input type="hidden" name="uidb64" value="{{ uidb64 }}">
    <input type="hidden" name="token" value="{{ token }}">
    <button type="submit">重置密码</button>
</form>

同时调整你的SetNewPasswordAPIView,确保能接收POST请求并正确解析这些参数。

内容的提问来源于stack exchange,提问作者Chen Triều

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:09:06