Wtforms自定义验证消息被忽略

6
我正在使用Flask构建一个非常简单的注册表单,我想要自定义DataRequiredEmail验证器的错误消息,但似乎我的自定义消息被忽略了,而是打印默认消息。以下是我的代码片段:

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 %}

在表单中,当我将usernameemail字段留空时,我收到的验证弹出消息是“请填写此字段”,这应该是默认的吧。我还尝试在这些字段留空时打印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”中,而自定义消息也没有生效?这两者有关联吗?

你能更新你的 signup.html 文件吗? - Chien Nguyen
奇怪,我尝试了你的代码,它仍然可以正常工作。 - Chien Nguyen
你说它运行良好,试着为“DataRequired”和“Email”验证器设置自定义消息,然后尝试将字段留空或者在电子邮件中输入一些错误的值,看看你会得到什么验证消息。 - Rohit
这是我得到的内容 https://imgur.com/a/MoKAznz - Chien Nguyen
1
好的,我明白了,你看到的信息是HTML5的默认设置。请参考这里:https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_required你可以在这里阅读如何禁用它:https://dev59.com/VVUL5IYBdhLWcg3wI1Ip?noredirect=1&lq=1 - Chien Nguyen
显示剩余7条评论
1个回答

6
< p > 自定义 < code > DataRequired 和 < code > Email 验证器的验证消息是因为应用程序客户端即浏览器使用这些验证器的默认消息。覆盖默认值的方法是在< code > html < code > form 中附加< code > novalidate 消息。

这告诉浏览器停止自己进行表单验证,以便由后端处理,本例中为flask。

我只需要对我的< code > signup.html 进行这个更改,它就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接