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

