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

Django使用CreateView时如何在模板中显示表单验证错误

Django CreateView 模板中获取表单验证错误的实现方法

你遇到的{{ form.as_p }}可正常显示错误,但手动调用{{ form.errors }}、{{ field.errors }}获取不到内容的问题,核心由两点导致:

  • 直接写{{ field.errors }}时上下文不存在field变量:未通过循环表单字段生成该变量,自然无法拿到对应字段的错误
  • Django表单错误分为非字段全局错误和字段绑定错误两类,form.errors是包含两类错误的类字典结构,直接渲染不会输出可读文本,必须遍历才能拿到具体错误内容

可直接使用以下模板写法获取并展示错误:

1. 分位置精准展示错误

全局非字段错误

这类错误不绑定到具体输入项(比如两次密码输入不匹配、账号整体规则校验失败等),直接在表单开头调用对应标签即可:

{{ form.non_field_errors }}

字段级错误

必须先循环表单所有字段,再在字段块内调用field.errors获取当前字段的验证错误,完整模板示例:

<form method="POST">
    {% csrf_token %}
    {# 渲染全局错误 #}
    {% if form.non_field_errors %}
        <div class="error-block">
            {% for err in form.non_field_errors %}
                <p class="error-text">{{ err }}</p>
            {% endfor %}
        </div>
    {% endif %}

    {# 循环渲染每个字段+对应错误 #}
    {% for field in form %}
        <div class="form-item">
            {{ field.label_tag }}
            {{ field }}
            {% if field.errors %}
                <ul class="error-list">
                {% for err in field.errors %}
                    <li class="error-text">{{ err }}</li>
                {% endfor %}
                </ul>
            {% endif %}
        </div>
    {% endfor %}
    <button type="submit">注册</button>
</form>

2. 一次性输出所有错误

如果不需要区分错误位置,想直接展示全部验证结果,可直接遍历form.errors字典:

{% if form.errors %}
    <div class="error-block">
        <p>提交内容存在以下问题:</p>
        <ul class="error-list">
            {% for field_label, errors in form.errors.items %}
                {% for err in errors %}
                    <li>{{ err }}</li>
                {% endfor %}
            {% endfor %}
        </ul>
    </div>
{% endif %}

注意:如果你的SignUp视图重写了post()或者form_valid()方法,不要在表单验证失败时返回重定向响应,否则表单错误上下文会被清空,模板无法拿到错误内容。你当前使用form.as_p能正常显示错误,说明视图逻辑没有问题,只需要调整模板取值方式即可。

内容的提问来源于stack exchange,提问作者David Amlaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:01:47