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

Django三步注册第三步密码表单验证失效问题求助

问题解决方案

表单继承类选择

第三步的密码表单应该继承forms.Form而非ModelForm,因为password1和password2并非User模型的字段,ModelForm主要用于绑定模型已有字段的表单,额外字段用普通Form类更合适,也能避免不必要的模型绑定逻辑干扰验证。

实现内置验证的具体修改

1. 修正forms.py代码

from django import forms
from django.contrib.auth.password_validation import validate_password

class RegistrationForm3(forms.Form):  # 改为继承forms.Form
    password1 = forms.CharField(
        widget=forms.PasswordInput(
            attrs={
                'class': 'main_auth-right-form-input main_auth-right-form-input-cod',
                'placeholder': 'Введите пароль',
                'type': 'password',
            }
        ),
        validators=[validate_password]  # 保留内置密码规则验证
    )
    password2 = forms.CharField(
        widget=forms.PasswordInput(
            attrs={
                'class': 'main_auth-right-form-input main_auth-right-form-input-cod-again',
                'placeholder': 'Введите пароль еще раз',
                'type': 'password',
            }
        ),
        validators=[validate_password]
    )

    # 添加密码一致性校验
    def clean(self):
        cleaned_data = super().clean()
        password1 = cleaned_data.get('password1')
        password2 = cleaned_data.get('password2')

        if password1 and password2 and password1 != password2:
            self.add_error('password2', '两次输入的密码不一致')  # 给password2字段添加错误提示
        return cleaned_data

2. 修正views.py中的用户创建逻辑

注意:不要直接给password字段赋值,Django需要对密码进行哈希处理,直接存明文会导致用户无法登录,需改用set_password()方法:

def form_valid(self, form):
    print("Форма прошла валидацию успешно.")
    registration_data = self.request.session.get('registration_data')
    print(registration_data)
    if registration_data:
        user = CustomUser.objects.create(
            first_name=registration_data['first_name'],
            last_name=registration_data['last_name'],
            email=registration_data['email'],
            phone_number=registration_data['phone_number'],
            notification_access=registration_data['notification_access'],
            email_verified=True,
            # 此处不要直接赋值password
        )
        # 使用set_password设置哈希后的密码
        user.set_password(form.cleaned_data['password1'])
        user.save()  # 必须保存修改

        del self.request.session['registration_data']
        self.request.session.save()
        return super().form_valid(form)
    else:
        return self.form_invalid(form)

验证逻辑说明

  • validate_password会自动校验密码的长度、字符复杂度等Django内置规则,不符合要求时会自动生成错误提示。
  • 重写clean()方法实现两次输入密码的一致性校验,不一致时给对应字段添加错误信息,会在模板中显示。
  • 改用forms.Form后,表单会正常触发所有字段的验证逻辑,不再出现任意输入都跳转成功的问题。

内容的提问来源于stack exchange,提问作者НИКИТА ТУМАШЕВИЧ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:49:55