【问题标题】:Wtforms custom validation message ignoredWtforms 自定义验证消息被忽略
【发布时间】:2019-06-19 08:46:42
【问题描述】:

我正在使用烧瓶构建一个非常简单的注册表单,我想为 DataRequiredEmail 验证器自定义错误消息,但是似乎我的自定义消息被忽略了,并且正在打印默认消息。下面是我的代码sn-p

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 以及为什么自定义消息没有生效。这些是如何相关的吗?

【问题讨论】:

标签: flask flask-wtforms


【解决方案1】:

DataRequiredEmail 验证器的自定义验证消息的原因是因为作为浏览器的应用程序客户端正在为这些验证器使用默认消息。覆盖该默认值的方法是将novalidate 消息附加到html form

这告诉浏览器停止自己进行表单验证,以便它可以由后端处理,在这种情况下是烧瓶。

这是我必须对signup.html 进行的唯一更改,并且效果很好。

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多