【问题标题】:Why aren't custom form error messages being displayed in Django 1.11?为什么 Django 1.11 中不显示自定义表单错误消息?
【发布时间】:2019-11-09 19:54:21
【问题描述】:

当我第一次使用 Django 1.8 构建我的应用程序时,我能够创建如下自定义表单错误消息:

# forms.py
class UserProfileForm(forms.ModelForm):

    user_age = forms.IntegerField(
        label = 'Your age',
        error_messages = {'required': 'Please enter your age},
        widget  =  forms.NumberInput(attrs={'class': 'form-control'}))


# create_user_profile.html
<form method="post" action=".">
{% csrf_token %}

<div class="form-group form-errors">
    {% if form.errors %}
        <p class="errornote">
        {% if form.errors.items|length == 1 %}
            Please correct the error below.
        {% else %}
           Please correct the errors below.
        {% endif %}
        </p>
    {% endif %}
</div>

<div class="form-group form-errors">
    {% if form.non_field_errors %}
        {% for error in form.non_field_errors %}
            <p class="errornote">
            {{ error }}
            </p>
        {% endfor %}
    {% endif %}
</div>

<div class="form-group">
    <label for="id_user_age">Your age</label>
    {{ form.user_age.errors }}
    {{ form.user_age }}
</div>

如果用户没有填写他们的“user_age”表单域,模板页面会在页面顶部显示一条错误消息,并且该表单域的错误消息如下:

Please correct the error below.

Your age
Please enter your age
+--------------------+
|                    |
+--------------------+

但是,我最近从 Django 1.8 升级到 Django 1.11,我意识到我的自定义表单错误消息不再显示。相反,如果用户没有在 Django 1.11 的表单字段中输入他们的年龄,则会显示一条包含感叹号的通用消息“气泡”:

Your age
+--------------------+
|                    |
+--------------------+
      ! Please fill out this field

这发生在我所有的桌面浏览器、Safari、Firefox、Chrome、Brave 等中。

当我从 Django 1.8 升级到 1.11 时,我不记得在发行说明中阅读过此更改(尽管我可能错过了它)。这里发生了什么?如何让 Django 1.11 像在 Django 1.8 中一样显示我的自定义表单字段错误消息。

【问题讨论】:

  • 这些是 HTML5 验证消息,与 Django 无关。表单甚至没有提交到后端。
  • 感谢您指出这一点。你知道 Django 是否有关于如何处理这种 HTML5 行为的“意见”,因为它提供了一种自定义表单错误消息的方法?搜索“禁用 HTML5 验证消息”表明有办法处理这个问题。坦率地说,我认为我的错误信息更有指导意义。再次感谢。
  • 但这仍然引出了一个问题,“Django 发生了什么变化?”当我在一个浏览器选项卡中打开运行 Django 1.8 的生产网站并在第二个浏览器选项卡中打开运行 Django 1.11 的站点的测试版本时,Django 1.8 选项卡中没有 HTML5 验证;我看到了我的自定义错误消息。我只在 Django 1.11 选项卡中看到此 HTML5 验证错误消息。
  • 当然你可以禁用它们,但正如我所说,这是一个 HTML 问题而不是 Django 问题:将 novalidate 放在 html 表单标签中。
  • 现在我知道要寻找什么,我认为这种变化发生在 Django 1.10 中。在 1.10 发行说明的 Miscellaneous 部分中,它说:“必填表单字段现在具有所需的 HTML 属性。将 Form.use_required_attribute 属性设置为 False 以禁用它。如果您还可以将 novalidate 属性添加到
    不想要浏览器验证。”

标签: django django-forms django-templates


【解决方案1】:

正如 Daniel Roseman 所指出的,我看到的行为是由客户端执行的 HTML5 验证引起的。甚至没有数据被传回服务器,因此可以触发我的自定义表单验证。这种新行为是在 Django 1.10 中引入的。 documentation 状态,

必填表单字段现在具有 required HTML 属性。设置 Form.use_required_attribute 属性为 False 以禁用它。你 如果您不想要,也可以添加 novalidate 属性 浏览器验证。禁用自定义的必需属性 小部件,覆盖 Widget.use_required_attribute() 方法。

正如文档所说,您可以通过将“novalidate”属性添加到 HTML 表单来覆盖它。但是,我发现如果让 Django 将“必需”属性添加到所有 HTML 表单标签,然后添加额外的自定义表单验证,则可以为表单添加额外的安全级别。 required 属性将确保用户在每个必填字段中输入 something。但是如果他们输入的内容无效,您的表单可以提供额外的验证,这些验证将显示在响应中。当然,您可以使用 JavaScript 和/或 Ajax 实现完整的客户端验证,或者使用像 Django-parsley 这样的包来完全放弃服务器端验证。这是一次有趣的学习经历。

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多