You need to enable JavaScript to run this app. Django中UserCreationForm的form.is_valid()一直返回false问题排查
优惠活动
大模型
产品
解决方案
定价
更多

Django中UserCreationForm的form.is_valid()一直返回false问题排查

问题根本原因
  1. 自定义表单字段名与继承的父类逻辑不匹配:你使用的UserCreationForm是Django自带的用户注册表单基类,内置校验逻辑默认使用password1、password2作为密码字段名,会自动校验两个密码是否一致、是否符合密码强度规则。你自定义表单时将第一个密码字段改为password,导致父类校验逻辑无法读取到对应密码值,直接触发校验失败。
  2. 前端模板与表单字段不匹配:模板中提交的密码字段参数名为password,和后端表单期望的字段名不一致,提交的参数无法被表单正确识别。
  3. 字段属性配置错误:你将密码字段设为非必填(required=False),且使用明文输入组件TextInput,既不符合注册逻辑的必填要求,也存在明文泄露密码的安全隐患。
  4. 缺少错误提示渲染逻辑:模板中没有添加表单错误的展示代码,校验失败后无法直观看到错误原因,只能感知到提交无响应。
解决方案

1. 修正forms.py代码

删除自定义的password、password2字段,重载父类自带的password1、password2字段调整配置即可,修改后代码如下:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False, help_text='可选', widget=forms.TextInput(attrs={'placeholder': '你的名'}))
    last_name = forms.CharField(max_length=30, required=False, help_text='可选', widget=forms.TextInput(attrs={'placeholder': '你的姓'}))
    email = forms.EmailField(max_length=254, required=True, help_text='请输入有效的邮箱地址', widget=forms.EmailInput(attrs={'placeholder': '你的邮箱'}))
    
    # 重载父类自带的密码字段,自定义样式和提示文本
    password1 = forms.CharField(
        max_length=30, 
        required=True, 
        help_text='请输入密码', 
        widget=forms.PasswordInput(attrs={'placeholder': '密码'})
    )
    password2 = forms.CharField(
        max_length=30, 
        required=True, 
        help_text='请再次输入密码确认', 
        widget=forms.PasswordInput(attrs={'placeholder': '重复输入密码'})
    )

    class Meta:
        model = User
        widgets = {
            'username': forms.TextInput(attrs={'placeholder': '用户名'})
        }
        fields = [
            'username', 
            'first_name', 
            'last_name', 
            'email', 
            'password1', 
            'password2', 
        ]

2. 修正register.html模板代码

首先在表单开头添加错误提示渲染逻辑,方便后续排查问题,然后将原来的{{form.password}}修改为{{form.password1}}和表单字段保持一致:

<form method="POST" action="" class="register-form" id="register-form">
    {%csrf_token%}
    <!-- 新增表单错误提示 -->
    {% if form.errors %}
    <div style="color: red;margin-bottom: 15px;">
        {% for field, errors in form.errors.items %}
            {% for error in errors %}
                <p>{{ field }}: {{ error }}</p>
            {% endfor %}
        {% endfor %}
    </div>
    {% endif %}
    <div class="form-group">
        <label for="username"><i class="zmdi zmdi-account material-icons-name"></i></label>
        {{form.username}}
    </div>
    <div class="form-group">
        <label for="first_name"><i class="zmdi zmdi-account material-icons-name"></i></label>
        {{form.first_name}}
    </div>
    <div class="form-group">
        <label for="last_name"><i class="zmdi zmdi-account material-icons-name"></i></label>
        {{form.last_name}}
    </div>
    <div class="form-group">
        <label for="email"><i class="zmdi zmdi-email"></i></label>
        {{form.email}}
    </div>
    <div class="form-group">
        <label for="password1"><i class="zmdi zmdi-lock"></i></label>
        {{form.password1}}
    </div>
    <div class="form-group">
        <label for="password2"><i class="zmdi zmdi-lock-outline"></i></label>
        {{form.password2}}
    </div>
    <div class="form-group">
        <input type="checkbox" name="agree-term" id="agree-term" class="agree-term" />
        <label for="agree-term" class="label-agree-term"><span><span></span></span>我同意所有<a href="#" class="term-service">服务条款</a></label>
    </div>  
    <div class="form-group form-button">
        <input type="submit" name="signup" id="signup" class="form-submit" value="注册"/>
    </div>
</form>

修改完成后重启服务再测试注册功能即可正常提交、保存用户。

内容的提问来源于stack exchange,提问作者M.K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 07:45:06