在 Flask 中验证失败时如何覆盖 html 默认值 "Please fill out this field"?
How to override the html default "Please fill out this field" when validation fails in Flask?
我有一个带有 DataRequired
验证器和相关错误消息的 Flask-WTF 表单。但是,Chrome 浏览器似乎忽略了我的错误消息,只显示 "Please fill out this field"。我如何让 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')
截至 WTForms 2.2, the HTML required
attribute is rendered when the field has a validator that sets the "required" flag。这允许客户端执行一些基本验证,节省往返服务器的时间。
你应该把它留给浏览器来处理。这些消息是标准的,并根据用户计算机的区域设置进行了调整。有一个 JavaScript API 来控制这些消息(参见 Stack Overflow and MDN),尽管 WTForms 不提供与它的任何集成(但是,一个扩展的好主意)。
如果你真的想要禁用它,你可以在渲染字段时传递required=False
。
{{ form.name(required=False) }}
您可以通过覆盖 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)
您可以通过继承禁用它的基本表单来为多个表单禁用它。
class UserForm(NoRequiredForm):
...
您还可以通过在 HTML form
标记上设置 novalidate
属性来禁用客户端验证,而无需更改太多代码。
<form novalidate>
</form>
See the discussion on the pull request adding this behavior.
在我的代码中这样工作:
在 html 文件上:
{{ CustomForm(form.birth, class="form-control", required=False ) }}
在 .py 文件上:
birth = DateField('date of birth', validators=[DataRequired(message="My custom message")])
我有一个带有 DataRequired
验证器和相关错误消息的 Flask-WTF 表单。但是,Chrome 浏览器似乎忽略了我的错误消息,只显示 "Please fill out this field"。我如何让 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')
截至 WTForms 2.2, the HTML required
attribute is rendered when the field has a validator that sets the "required" flag。这允许客户端执行一些基本验证,节省往返服务器的时间。
你应该把它留给浏览器来处理。这些消息是标准的,并根据用户计算机的区域设置进行了调整。有一个 JavaScript API 来控制这些消息(参见 Stack Overflow and MDN),尽管 WTForms 不提供与它的任何集成(但是,一个扩展的好主意)。
如果你真的想要禁用它,你可以在渲染字段时传递required=False
。
{{ form.name(required=False) }}
您可以通过覆盖 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)
您可以通过继承禁用它的基本表单来为多个表单禁用它。
class UserForm(NoRequiredForm):
...
您还可以通过在 HTML form
标记上设置 novalidate
属性来禁用客户端验证,而无需更改太多代码。
<form novalidate>
</form>
See the discussion on the pull request adding this behavior.
在我的代码中这样工作:
在 html 文件上:
{{ CustomForm(form.birth, class="form-control", required=False ) }}
在 .py 文件上:
birth = DateField('date of birth', validators=[DataRequired(message="My custom message")])