【问题标题】:For some FlaskForm validators, error message does not pop up对于某些 FlaskForm 验证器,不会弹出错误消息
【发布时间】:2022-01-21 22:45:28
【问题描述】:

虽然“DataRequired”和“NumberRange”会弹出错误消息,但“EqualTo”(以及我自己的自定义“MoreThan”)不会。我怎样才能让他们也产生弹出消息?

############################################## ##################### 我的表单有三个字段。 “min_nFeatures”必须低于“max_nFeatures”,因此我将“EqualTo”验证器的代码更改为“MoreThan”(如Code a validator for a WTForms form which compares the inputs from two fields 中所建议的那样)。验证器正在工作:如果用户为“min_nFeatures”输入更大的值,它不会通过(它返回到同一页面)。但是,没有像其他内置验证器那样弹出消息(例如,如果用户没有输入任何内容,则会弹出“请填写此字段”)。我希望自定义验证器具有相同的行为。

我的代码:

class MoreThan(object):   

    def __init__(self, fieldname, message=None):
        self.fieldname = fieldname
        self.message = message

    def __call__(self, form, field):
        try:
            other = form[self.fieldname]
        except KeyError:
            raise ValidationError(field.gettext("Invalid field name '%s'.") % self.fieldname)
        if field.data <= other.data:
            d = {
                'other_label': hasattr(other, 'label') and other.label.text or self.fieldname,
                'other_name': self.fieldname
            }
            message = self.message
            if message is None:
                message = field.gettext(
                    'The maximal number of expressed genes has to be larger than the minimal number of expressed genes')

            raise ValidationError(message)


class vln_plot_form(FlaskForm):
    min_nFeatures = IntegerField('* Minimal number of expressed genes:', validators=[DataRequired()])
    max_nFeatures = IntegerField('* Maximal number of expressed genes:',
                                 validators=[DataRequired(), MoreThan('min_nFeatures')])
    max_mtpercent = IntegerField('Maximal percent of mitochondrial gene expression:', validators=[NumberRange(1, 100)])
    submit = SubmitField('Submit')

查看:

@app.route('/vln', methods=['POST', 'GET'])
def violin_plots():
    ...
    form = vln_plot_form()
    if request.method == 'POST':
        if form.validate_on_submit():
            ...
            return redirect(url_for('next_page'))

    return render_template('violin_plots.html', form=form)

我阅读了Message not flashing on some WTForm validation methods,但无法将其应用于我的案例。

############################################## ######################### 编辑: 这是我的 HTML 代码:

{% extends 'base.html' %}
{% block head %}
<title>HELLO</title>
{% endblock %}

{% block body %}
<center><h1>Run!</h1></center>
<h2>Step 2/3</h2>
<figure>
    <img src={{ vln_plot_file }} align="middle" alt="vln_plot" style="width:70%">
</figure>

<form method="POST" action="" enctype="multipart/form-data">
    {{ form.hidden_tag() }}
    <div class="form-horizontal">
        <div class="form-group col-md-6">
            {{ form.csrf_token() }}
            <label for=""> {{ form.min_nFeatures.label }}</label>
            {{ form.min_nFeatures }}
        </div>

        <div class="form-group col-md-6">
            {{ form.csrf_token() }}
            <label for=""> {{ form.max_nFeatures.label }}</label>
            {{ form.max_nFeatures }}
        </div>

        {% if with_mt %}
        <div class="form-group col-md-6">
            {{ form.csrf_token() }}
            <label for=""> {{ form.max_mtpercent.label }}</label>
            {{ form.max_mtpercent }}
        </div>
        {% endif %}
        <div class="form-group">
            {{ form.csrf_token() }}
            {{ form.submit(class="btn btn-primary")}}
        </div>
    </div>
    {% if form.errors %}
    {{ form.errors }}
    {% endif %}
</form>


{% endblock %}

由于我在 HTML 末尾添加了“{{ form.errors }}”,我确实在网页底部看到了正确的 form.errors,但这当然是一种非常丑陋的显示错误的方式...

【问题讨论】:

  • 你能展示一下你的html代码是什么样子的吗?
  • 当然,我已将其添加到问题中。

标签: python flask flask-wtforms wtforms


【解决方案1】:

这应该可以解决问题:

<form method="POST" action="" enctype="multipart/form-data">
    {{ form.hidden_tag() }}
    <div class="form-horizontal">
        <div class="form-group col-md-6">
            {{ form.csrf_token() }}
            <label for=""> {{ form.min_nFeatures.label }}</label>
            {{ form.min_nFeatures }}
            {% for error in form.min_nFeatures.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </div>

        <div class="form-group col-md-6">
            {{ form.csrf_token() }}
            <label for=""> {{ form.max_nFeatures.label }}</label>
            {{ form.max_nFeatures }}
            {% for error in form.max_nFeatures.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </div>

        {% if with_mt %}
        <div class="form-group col-md-6">
            {{ form.csrf_token() }}
            <label for=""> {{ form.max_mtpercent.label }}</label>
            {{ form.max_mtpercent }}
            {% for error in form.max_mtpercent.errors %}
                <span style="color: red;">[{{ error }}]</span>
            {% endfor %}
        </div>
        {% endif %}
        <div class="form-group">
            {{ form.csrf_token() }}
            {{ form.submit(class="btn btn-primary")}}
        </div>
    </div>
</form

请注意我如何分别管理每个字段的错误显示。

【讨论】:

  • 谢谢!它比我以前的要好得多......但是 - 有没有办法像内置验证器一样弹出错误消息?
  • 我无法弄清楚为什么它的工作方式不同,自定义验证器 MoreThan(或原始 EqualTo)引发 ValidationError 与 DataRequired 和 NumberRange 相同,所以为什么消息没有在 MoreThan 中弹出和EqualTo 就像在 DataRequired 和 NumberRange 中一样?
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2018-02-22
相关资源
最近更新 更多