django 表单错误。得到没有任何 html 标签的错误

Posted

技术标签:

【中文标题】django 表单错误。得到没有任何 html 标签的错误【英文标题】:django form errors. get the error without any html tags 【发布时间】:2013-05-17 15:58:22 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

表单文档部分中的This section 包含所有详细信息,即这个sn-p:

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

【讨论】:

您的代码有错别字。 % if form.error % -> % if form.errors %【参考方案3】:

为 Django 2.1 更新

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

    Form.errors

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

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

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

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

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

    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 中呈现错误消息的代码。

    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 中使用它们。

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

【讨论】:

【参考方案4】:

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

【讨论】:

感谢 form.non_field_errors 。度过了我的一天

以上是关于django 表单错误。得到没有任何 html 标签的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何让来自 Ajax 的 Django 表单错误出现在用户屏幕上?

Django 2.0 - 渲染错误的模板(没有错误)

表单未在 Django 中发布

在自定义 Django 表单中验证和显示错误

如何在 Django 中列出所有与表单相关的错误?

Django 表单未接收输入