Django注册表单提交报错 验证失败无法保存数据
问题根源
表单验证100%失败的核心原因是字段命名和继承的父类要求不匹配:
你自定义的RegisterForm继承自Django内置的UserCreationForm,该类内置的密码校验、两次密码一致性校验逻辑,固定要求两个密码字段名为password1(首次输入密码)和password2(确认密码)。你手动将第一个密码字段命名为password,覆盖了父类默认字段,导致父类校验逻辑找不到必填的password1字段,无论输入什么内容form.is_valid()都会直接返回False。
另外模板里的错误展示逻辑存在多处笔误,校验失败时不会输出具体错误原因,只会触发通用报错,导致一直无法定位问题。
修复方案
按以下顺序修改代码即可:
- 修改
Forms.py,将自定义的password字段重命名为password1,同步调整Meta类的字段列表 - 修改模板文件,修正字段渲染的变量名、错误判断的笔误,补上缺失的属性等号,确保后续校验错误能正常展示
修正后的Forms.py代码
class RegisterForm(UserCreationForm): email = forms.EmailField(max_length=100,help_text='Enter Email Address', required=True,widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Email'})) first_name = forms.CharField(max_length=100,help_text='Enter First Name', required=True,widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'First Name'})) last_name = forms.CharField(max_length=100,help_text='Enter Last Name', required=True,widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Last Name'})) username = forms.CharField(max_length=100,help_text='Enter Username', required=True,widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'})) # 字段名从password改为password1,适配UserCreationForm的内置校验逻辑 password1 = forms.CharField(max_length=200,help_text='Enter Password', required=True,widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'})) password2 = forms.CharField(max_length=200,help_text='Enter your Password again', required=True,widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'})) class Meta: model = User fields = [ 'username', 'email', 'first_name', 'last_name', 'password1', 'password2' ]
修正后的模板核心代码
主要修改3处笔误:密码字段渲染变量名、错误判断条件、错误取值变量,补上class属性缺失的等号
<form action="#" class="p-4 border rounded" method = 'POST'> {% csrf_token %} <div class="row form-group"> <div class="col-md-12 mb-3 mb-md-0"> <label class="text-black" for="fname">Email</label> {{ form.email }} </div> {% if form.email.errors %} {% for error in form.email.errors %} <div class="alert"> {{ error|escape }} </div> {% endfor %} {% endif %} </div> <div class="row form-group"> <div class="col-md-12 mb-3 mb-md-0"> <label class="text-black" for="fname">Password</label> <!-- 字段名从form.password改为form.password1 --> {{ form.password1 }} </div> <!-- 修正错误的判断条件,原写法form.email.password为笔误 --> {% if form.password1.errors %} {% for error in form.password1.errors %} <div class="alert"> {{ error|escape }} </div> {% endfor %} {% endif %} </div> <div class="row form-group mb-4"> <div class="col-md-12 mb-3 mb-md-0"> <label class="text-black" for="fname">Re-Type Password</label> {{ form.password2 }} </div> {% if form.password2.errors %} <!-- 修正错误取值,原写法取form.password.errors为笔误 --> {% for error in form.password2.errors %} <div class="alert"> {{ error|escape }} </div> {% endfor %} {% endif %} </div> <!-- 其余first_name、last_name字段块只需要把class "alert"改成class="alert"即可,逻辑无问题 --> <div class="row form-group"> <div class="col-md-12 mb-3 mb-md-0"> <label class="text-black" for="fname">First Name</label> {{ form.first_name}} </div> {% if form.first_name.errors %} {% for error in form.first_name.errors %} <div class="alert"> {{ error|escape }} </div> {% endfor %} {% endif %} </div> <div class="row form-group"> <div class="col-md-12 mb-3 mb-md-0"> <label class="text-black" for="fname">Last Name</label> {{ form.last_name}} </div> {% if form.last_name.errors %} {% for error in form.last_name.errors %} <div class="alert"> {{ error|escape }} </div> {% endfor %} {% endif %} </div> <div class="row form-group"> <div class="col-md-12"> <input type="submit" value="Sign Up" class="btn px-4 btn-primary text-white"> </div> </div> </form>
注:
Views.py逻辑无问题,不需要修改,改完上述两处文件后重启服务即可正常提交注册。
内容的提问来源于stack exchange,提问作者Arkham007
相关产品推荐
相关产品推荐

