为什么自定义表单错误消息未在Django 1.11中显示?

时间:2019-06-27 18:42:25

标签: django django-forms django-templates

当我第一次使用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中一样。

1 个答案:

答案 0 :(得分:0)

正如丹尼尔·罗斯曼(Daniel Roseman)所指出的那样,我看到的行为是由在客户端执行HTML5验证引起的。甚至没有数据传递回服务器,因此可以触发我的自定义表单验证。 Django 1.10中引入了此新行为。 documentation状态

  

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

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