如何实现Django表单验证失败提交后保留非错误字段值
解决表单验证失败后字段内容清空的问题
问题出在你手动编写的<input>标签没有绑定表单提交后的值,Django在表单验证失败时已经保留了用户输入的有效数据,只需在模板中正确渲染这些值即可。
方法一:直接使用Django表单字段渲染(推荐)
你的CustomUserCreationForm已经定义了每个字段的widget属性(包括class、placeholder),直接渲染表单字段会自动填充提交后的值,同时简化模板代码:
修改后的注册表单模板:
<form method="POST" class="requires-validation" novalidate> {% csrf_token %} <div class="col-md-12"> {{ form.first_name }} {% if form.first_name.errors %} {% for error in form.first_name.errors %} <span style="color:#DC3545;">{{ error }}</span> {% endfor %} {% endif %} </div> <div class="col-md-12"> {{ form.last_name }} {% if form.last_name.errors %} {% for error in form.last_name.errors %} <span style="color:#DC3545;">{{ error }}</span> {% endfor %} {% endif %} </div> <div class="col-md-12"> {{ form.email }} {% if form.email.errors %} {% for error in form.email.errors %} <span style="color:#DC3545;">{{ error }}</span> {% endfor %} {% endif %} </div> <div class="col-md-12"> {{ form.password1 }} {% if form.password1.errors %} {% for error in form.password1.errors %} <span style="color:#DC3545;">{{ error }}</span> {% endfor %} {% endif %} </div> <div class="col-md-12"> {{ form.password2 }} {% if form.password2.errors %} {% for error in form.password2.errors %} <span style="color:#DC3545;">Passwords do not match, confirm and try again</span> {% endfor %} {% endif %} </div> <div class="form-button mt-3"> <button id="submit" type="submit" class="btn btn-primary">Register</button> </div> <br> <span>Already have an account?<a href=""> Sign in</a></span> </form>
方法二:手动为input添加value属性
如果你不想改变现有input的写法,只需给每个input标签添加value属性,绑定表单字段的提交值:
示例(以first_name字段为例):
<input class="form-control" type="text" name="first_name" placeholder="Firstname" required value="{{ form.first_name.value|default:'' }}">
对last_name、email字段做同样修改即可。
关于密码字段的说明
出于安全考虑,Django默认不会保留密码字段的输入值,验证失败后密码框会清空。如果需要保留密码值,需在表单类中给密码字段的widget添加render_value=True参数:
修改CustomUserCreationForm中的密码字段:
password1 = forms.CharField( label='', widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder':'Enter Password'}, render_value=True) ) password2 = forms.CharField( label='', widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder':'Enter Password again'}, render_value=True) )
注意:保留密码值存在安全风险,不建议在生产环境中使用。
验证views.py代码
你的register_view逻辑是正确的,当POST请求验证失败时,已经将带有用户提交数据的form对象传递给模板,无需修改。
内容的提问来源于stack exchange,提问作者Bigfafs
相关产品推荐
相关产品推荐

