10

我想在我的模板上显示非 html 版本的表单错误。

默认情况下,错误是<ul class="errorlist">我想避免的。

无论如何要在没有大量代码更改的情况下做到这一点?

4

4 回答 4

21

Django 1.7 中有两个新方法也可以用来解决这个问题:

Form.errors.as_data()

>>> f.errors.as_data()
{'sender': [ValidationError(['Enter a valid email address.'])],
'subject': [ValidationError(['This field is required.'])]}

Form.errors.as_json()

>>> f.errors.as_json()
{"sender": [{"message": "Enter a valid email address.", "code": "invalid"}],
"subject": [{"message": "This field is required.", "code": "required"}]}
于 2014-05-27T07:04:56.697 回答
8

表单文档部分中的此部分包含所有详细信息,即此代码段:

{% if form.subject.errors %}
    <ol>
    {% for error in form.subject.errors %}
        <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ol>
{% endif %}

替换form为您在模板中调用表单类的任何内容。在本例中,subject是表单中的一个字段。如果您想有一个单独的部分来总结所有错误,只需遍历这些字段:

{% if form.errors %}
   {% for field in form %}
      {% for error in field.errors %}
          {{ error|escape }}
      {% endfor %}
   {% endfor %}
{% endif %}
于 2013-05-22T14:33:54.523 回答
3

为 Django 2.1 更新

我们有 4 个选项来访问视图中的表单错误。

  1. 表单错误

访问 errors 属性以获取错误消息字典:

f.errors {'sender': ['Enter a valid email address.'], 'subject': ['This field is required.']}

在此字典中,键是字段名称,值是表示错误消息的字符串列表。错误消息存储在列表中,因为一个字段可以有多个错误消息。

您无需先调用 is_valid() 即可访问错误。表单的数据将在您第一次调用 is_valid() 或访问错误时进行验证。

无论您访问错误或调用 is_valid() 多少次,验证例程都只会被调用一次。这意味着如果验证有副作用,那些副作用只会被触发一次。

  1. Form.errors.as_data()

返回将字段映射到其原始 ValidationError 实例的字典。

f.errors.as_data() {'sender': [ValidationError(['Enter a valid email address.'])], 'subject': [ValidationError(['This field is required.'])]}

每当您需要通过其代码识别错误时,请使用此方法。当存在给定错误时,这可以实现诸如重写错误消息或在视图中编写自定义逻辑之类的事情。它还可以用于以自定义格式(例如 XML)序列化错误;例如,as_json() 依赖于 as_data()。

需要 as_data() 方法是因为向后兼容。以前,一旦将呈现的错误消息添加到 Form.errors 字典中,ValidationError 实例就会丢失。理想情况下,Form.errors 将存储 ValidationError 实例,并且带有 as_ 前缀的方法可以呈现它们,但必须以相反的方式完成,以免破坏期望在 Form.errors 中呈现错误消息的代码。

  1. Form.errors.as_json(escape_html=False)

返回序列化为 JSON 的错误。

f.errors.as_json() {"sender": [{"message": "Enter a valid email address.", "code": "invalid"}], "subject": [{"message": "This field is required.", "code": "required"}]}

默认情况下, as_json() 不会转义其输出。如果您将它用于诸如 AJAX 请求到客户端解释响应并将错误插入页面的表单视图之类的东西,您需要确保在客户端转义结果以避免交叉的可能性- 站点脚本攻击。使用像 jQuery 这样的 JavaScript 库很简单——只需使用 $(el).text(errorText) 而不是 .html()。

如果由于某种原因您不想使用客户端转义,您还可以设置 escape_html=True 并且错误消息将被转义,以便您可以直接在 HTML 中使用它们。

  1. Form.errors.get_json_data(escape_html=False) [django 2.0 中的新功能]

f.errors.get_json_data(escape_html=False)

将错误作为适合序列化为 JSON 的字典返回。Form.errors.as_json() 返回序列化的 JSON,而这将返回序列化之前的错误数据。

escape_html 参数的行为如 Form.errors.as_json() 中所述。

于 2019-01-22T14:52:59.463 回答
2

要访问某个字段的错误,请使用form.field_name.errors,其中“field_name”是生成错误的字段的名称。

使用 for 循环仍然很好,以防在该字段中生成多个错误。

粗略的例子:

{% for error in form.email.errors %}
    <label>{{ error|escape }}  </label>
{% endfor %}
<br>
<label>Email: </label>{{ form.email }}

有些错误可能与某个字段无关,例如,当两个密码字段不匹配时引发的错误。它们应该可以通过以下方式访问:

{{ form.non_field_errors }}
于 2015-01-06T03:52:46.943 回答