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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:05:33