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

自定义Django PasswordResetView时报__init__缺少user参数如何解决

问题根因

你的错误核心是表单与视图的场景不匹配:

  1. PasswordResetView 对应的是「提交邮箱申请密码重置」的页面,该阶段用户未验证身份,后端无法获取user对象,默认使用的PasswordResetForm初始化本身不需要user参数
  2. 你自定义的表单继承自SetPasswordForm,而SetPasswordForm是「用户点击邮箱重置链接后,输入新密码」阶段(对应PasswordResetConfirmView)才会用到的表单,初始化强制要求传入user参数,绑定到PasswordResetView自然会因为拿不到user参数报错

具体解决方案

方案1:最简全局密码长度校验(无需自定义表单)

直接通过Django自带的密码校验器实现全局长度限制,对所有内置密码相关表单(包括SetPasswordForm、用户注册表单等)都生效:
打开项目settings.py,修改AUTH_PASSWORD_VALIDATORS配置:

AUTH_PASSWORD_VALIDATORS = [
    # 保留原有其他校验规则
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 12, # 直接指定最小长度为12位
        }
    },
]

方案2:自定义表单实现复杂校验逻辑

如果需要做除了长度之外的自定义校验规则,按以下步骤修改即可:

  1. 定义自定义密码重置确认表单
# forms.py
from django.contrib.auth.forms import SetPasswordForm
from django import forms

class CustomSetPasswordForm(SetPasswordForm):
    def clean_new_password1(self):
        password1 = self.cleaned_data.get('new_password1')
        if len(password1) < 12:
            raise forms.ValidationError("密码长度不能少于12位")
        # 可在此处添加其他自定义校验逻辑
        return password1
  1. 修改urls.py中密码重置确认视图的表单配置,PasswordResetConfirmView会自动传入解析到的user对象,无需手动传参:
# urls.py
from django.contrib.auth import views as auth_views
from .forms import CustomSetPasswordForm

urlpatterns = [
    # 原有password_reset路径无需修改,保留默认表单即可
    path('accounts/password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'),
    # 仅修改密码重置确认路径的表单类
    path('accounts/reset/<uidb64>/<token>/', 
         auth_views.PasswordResetConfirmView.as_view(form_class=CustomSetPasswordForm), 
         name='password_reset_confirm'),
    # 其他认证相关路径保留原有配置即可
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:18:00