django形成错误。在没有任何html标签的情况下获取错误

时间:2013-05-22 14:30:10

标签: django django-forms

我想在我的模板上找到非html版本中表单的错误。

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

无论如何都没有大规模的代码更改吗?

4 个答案:

答案 0 :(得分:15)

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"}]}

答案 1 :(得分:6)

表单文档部分中的

This section包含所有详细信息,即此代码段:

{% 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 %}

答案 2 :(得分:1)

要访问某个字段的错误,请使用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 }}

答案 3 :(得分:0)

已针对Django 2.1更新

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

  1. Form.errors

访问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()所述。