Wtforms 自定义验证消息被忽略
Wtforms custom validation message ignored
我正在用 flask 构建一个非常简单的注册表单,我想为 DataRequired
和 Email
验证器自定义错误消息,但是我的自定义消息似乎被忽略了,默认的正在打印消息。下面是我的代码片段
forms.py
class SignUp(FlaskForm):
username = StringField('Username', validators=[DataRequired(message='Must be filled'), length(min=4, max=10)])
email = EmailField('Email', validators=[DataRequired(message='Email can\'t be blank'),
Email(message='valid email address required')])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password',
validators=[DataRequired(), EqualTo('password', 'Passwords must match')])
submit = SubmitField('Register')
signup.html
{% extends "base.html" %}
{% from "jinja_helpers.html" import render_field %}
{% from "jinja_helpers.html" import render_button %}
{% block body %}
<div class="container mt-4">
<form action="" method="POST">
{{ form.hidden_tag() }}
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm_password) }}
{{ render_button(form.submit) }}
</form>
<div class="form-row mt-3">
<small class="text-muted">Already have an account ? <a href="{{ url_for('login') }}">Log In</a></small>
</div>
</div>
{% endblock %}
jinja_helpers.html
{% macro render_field(field) %}
<div class="form-group">
{{ field.label(class="form-control-label font-weight-bold text-muted") }}
{% if field.errors %}
{{ field(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in field.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ field(class="form-control") }}
{% endif %}
</div>
{% endmacro %}
{% macro render_button(button) %}
{{ button(class="btn btn-dark") }}
{% endmacro %}
在表单上,当我将 username
或 email
字段留空时,我收到的验证弹出消息是 "Please fill out this field",我猜这是默认设置。当我将此字段留空时,我也尝试打印 form.errors
,奇怪的是 errors
字典是空的。
views.py
@app.route('/signup', methods=['GET', 'POST'])
def signup():
form = SignUp()
print(f'------{form.errors}')
if form.validate_on_submit():
username = form.username.data
password = form.password.data
user = User(username, password)
db.session.add(user)
db.session.commit()
flash('Account created successfully !', 'success')
return redirect(url_for("login"))
return render_template("signup.html", form=form, title='App-Sign Up')
这就是我得到的
------{}
127.0.0.1 - - [25/Jan/2019 19:08:34] "GET /signup HTTP/1.1" 200 -
127.0.0.1 - - [25/Jan/2019 19:08:34] "GET /static/css/main.css HTTP/1.1" 404 -
那么为什么这些错误没有被添加 errors
以及为什么自定义消息没有被 effect.Are 这些相关的一些如何?
DataRequired
和 Email
验证器的自定义验证消息的原因是因为作为浏览器的应用程序客户端正在使用这些验证器的默认消息。覆盖该默认值的方法是将 novalidate
消息附加到 html
form
。
这告诉浏览器停止自己进行表单验证,以便它可以由后端处理,在本例中是 flask。
这是我必须对 signup.html
进行的唯一更改,而且效果很好。
我正在用 flask 构建一个非常简单的注册表单,我想为 DataRequired
和 Email
验证器自定义错误消息,但是我的自定义消息似乎被忽略了,默认的正在打印消息。下面是我的代码片段
forms.py
class SignUp(FlaskForm):
username = StringField('Username', validators=[DataRequired(message='Must be filled'), length(min=4, max=10)])
email = EmailField('Email', validators=[DataRequired(message='Email can\'t be blank'),
Email(message='valid email address required')])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password',
validators=[DataRequired(), EqualTo('password', 'Passwords must match')])
submit = SubmitField('Register')
signup.html
{% extends "base.html" %}
{% from "jinja_helpers.html" import render_field %}
{% from "jinja_helpers.html" import render_button %}
{% block body %}
<div class="container mt-4">
<form action="" method="POST">
{{ form.hidden_tag() }}
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm_password) }}
{{ render_button(form.submit) }}
</form>
<div class="form-row mt-3">
<small class="text-muted">Already have an account ? <a href="{{ url_for('login') }}">Log In</a></small>
</div>
</div>
{% endblock %}
jinja_helpers.html
{% macro render_field(field) %}
<div class="form-group">
{{ field.label(class="form-control-label font-weight-bold text-muted") }}
{% if field.errors %}
{{ field(class="form-control is-invalid") }}
<div class="invalid-feedback">
{% for error in field.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ field(class="form-control") }}
{% endif %}
</div>
{% endmacro %}
{% macro render_button(button) %}
{{ button(class="btn btn-dark") }}
{% endmacro %}
在表单上,当我将 username
或 email
字段留空时,我收到的验证弹出消息是 "Please fill out this field",我猜这是默认设置。当我将此字段留空时,我也尝试打印 form.errors
,奇怪的是 errors
字典是空的。
views.py
@app.route('/signup', methods=['GET', 'POST'])
def signup():
form = SignUp()
print(f'------{form.errors}')
if form.validate_on_submit():
username = form.username.data
password = form.password.data
user = User(username, password)
db.session.add(user)
db.session.commit()
flash('Account created successfully !', 'success')
return redirect(url_for("login"))
return render_template("signup.html", form=form, title='App-Sign Up')
这就是我得到的
------{}
127.0.0.1 - - [25/Jan/2019 19:08:34] "GET /signup HTTP/1.1" 200 -
127.0.0.1 - - [25/Jan/2019 19:08:34] "GET /static/css/main.css HTTP/1.1" 404 -
那么为什么这些错误没有被添加 errors
以及为什么自定义消息没有被 effect.Are 这些相关的一些如何?
DataRequired
和 Email
验证器的自定义验证消息的原因是因为作为浏览器的应用程序客户端正在使用这些验证器的默认消息。覆盖该默认值的方法是将 novalidate
消息附加到 html
form
。
这告诉浏览器停止自己进行表单验证,以便它可以由后端处理,在本例中是 flask。
这是我必须对 signup.html
进行的唯一更改,而且效果很好。