【发布时间】: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