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,提问作者НИКИТА ТУМАШЕВИЧ
相关产品推荐
相关产品推荐

