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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:36:23