如何在Flask中验证失败时覆盖html默认"请填写此字段"?

Ben*_*Ben 6 python flask wtforms flask-wtforms

我有一个带有DataRequired验证器和相关错误消息的Flask-WTF表单.但是,Chrome浏览器似乎忽略了我的错误消息,只显示"请填写此字段".如何让Flask覆盖它并显示我的消息?

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired

class SignupForm(FlaskForm):
    first_name = StringField('First Name', validators=[DataRequired(message='Hey, put in your first name!')])
    last_name = StringField('Last Name', validators=[DataRequired("What, you can't remember your last name?")])
    email = StringField('Email', validators=[DataRequired('Gonna need your email address!')])
    password = PasswordField('Password', validators=[DataRequired('Really need a password, Dude!')])
    submit = SubmitField('Sign Up')
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 8

WTForms 2.2开始,required当字段具有设置"required"标志的验证器时,将呈现HTML 属性.这允许客户端执行一些基本验证,从而节省了到服务器的往返.

你应该把它留给浏览器来处理这个问题.消息是标准的,并根据用户计算机的区域设置进行调整.有一个JavaScript API来控制这些消息(请参阅Stack OverflowMDN),虽然WTForms不提供与它的任何集成(但是,扩展的好主意).

如果您确实要禁用此功能,则可以required=False在渲染字段时传递.

{{ form.name(required=False) }}
Run Code Online (Sandbox Code Playgroud)

您可以通过覆盖来禁用整个表单Meta.render_field.

class NoRequiredForm(Form):
    class Meta:
        def render_field(self, field, render_kw):
            render_kw.setdefault('required', False)
            return super().render_field(field, render_kw)
Run Code Online (Sandbox Code Playgroud)

您可以通过从禁用它的基本表单继承来禁用多个表单.

class UserForm(NoRequiredForm):
    ...
Run Code Online (Sandbox Code Playgroud)

您还可以通过novalidate在HTML form标记上设置属性来禁用客户端验证,而无需更改尽可能多的代码.

<form novalidate>

</form>
Run Code Online (Sandbox Code Playgroud)

请参阅有关添加此行为的pull请求的讨论.