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
相关产品推荐
相关产品推荐

