消息在某些 WTForm 验证方法中不闪烁

Message not flashing on some WTForm validation methods

这个问题与 有关,但重点是我在问另一个问题时不知道的一个潜在问题。

我正在使用 Python、Flask 和 WTForms 制作表格。这是 python:

from flask import render_template
from flask_wtf import FlaskForm
from wtforms import DecimalField, SubmitField
from wtforms.validators import NumberRange, DataRequired

class NumberForm(FlaskForm):
    question_one = DecimalField('Question 1', validators=[NumberRange(min=0, max=10)])
    question_two = DecimalField('Question 2', validators=[DataRequired()])
    submit = SubmitField('Submit')

@app.route('some_route/', methods=['GET', 'POST'])
def page():
    form = NumberForm()
    if form.validate_on_submit():
        return some_success_or_other
    return render_template('page.html', form=form)

和 HTML:

<form method="POST">
  <div class="form-group-row">
    {{ form.hidden_tag() }}
    {{ form.question_one.label }}
    <div>
      {{ form.question_one }}
    </div>
  </div>
  <div class="form-group-row">
    {{ form.question_two.label }}
    <div>
      {{ form.question_two }}
    </div>
  </div>
  <div class="form-group-row">
    {{ form.submit }}
  </div>
</form>

我使用的两个验证器(NumberRangeDataRequired)的行为不同。如果未在字段 2 中输入数据并单击提交按钮,则不会提交表单,并且会在字段旁边弹出一条错误消息,显示 "Please fill in this field".

当在字段 1 中提交字符串(而不是小数)或超出范围的数字时,按下按钮时表单会提交。
尽管错误已记录(并且可以使用 {{ form.errors }} 显示),但我希望两个验证器具有相同的行为 - 我希望在字段 1 中输入无效 numbers/strings 时阻止提交表单。

有人知道为什么验证者的行为不同吗?

HTML5 引入了 required 属性,如果其中一个字段(受此属性影响)尚未被验证,则必须填写字段并阻止表单验证人口稠密;此属性仅适用于输入标签。

使用flask-wtf,当你使用带有required验证器的字段时,它会自动生成一个带有required属性的html字段,这将阻止从被发送并显示信息的形式。

NumberRange等其他验证器的情况下,就不一样了。

与纯HTML:

要具有相同的行为,即检查输入的数字是否在明确定义的范围内,如果不是这样则阻止发送表单,有必要使用 pattern 属性(更多细节here)。对于这种特殊情况没有预定义模式,因此您需要使用 正则表达式 创建自定义模式。它将给出:<input type="text" pattern="[0-9]">.

现在我们只需要用 wtforms 重新采用相同的逻辑...

使用 wtforms:

<form method="POST">
    <div class="form-group-row">
        {{ form.hidden_tag() }}
        {{ form.question_one.label }}
        <div>
            {{ form.question_one(pattern="[0-9]") }}
        </div>
    </div>
    <div class="form-group-row">
        {{ form.question_two.label }}
        <div>
            {{ form.question_two }}
        </div>
    </div>
    <div class="form-group-row">
        {{ form.submit }}
    </div>
</form>

在第 {{ form.question_one(pattern="[0-9]") }} 行,我使用带有正则表达式的模式属性来检查输入的数字是否在 0 到 9 的范围内。对于更大的范围,您需要多写一些正则表达式复杂(this link 很有趣)