当错误的数据类型作为输入提交时,Flask wtforms DataRequired 验证器触发(而不是自定义或默认验证器)

问题描述 投票:0回答:1

尝试将

DataRequired()
和自定义验证器
validate_someNumber
附加到
FloatField
。但是当出现验证错误时,我很难理解表单字段错误的反馈。以下是我对相关领域的要求:

  • 应该有数据
  • 该字段应该只允许一个单一的数值
  • 该字段应该只允许最大整数放置到百位。例如:最大 999
  • 该字段应该只允许一个小数位。例如:999.9

表格.py

from flask_wtf import FlaskForm
from wtforms import FloatField
from wtforms.validators import DataRequired
from validators import validate_someNumber

class MyForm(FLaskForm):
    someNumber = FloatField('Some Number', validators=[DataRequired(), validate_someNumber])

验证器

from wtforms.validators import ValidationError

def validate_someNumber(form, field):
    if field.data is not None:
        whole_number = int(field.data)
        decimal_places = len(str(field.data).split('.')[1]) if '.' in str(field.data) else 0
        if whole_number > 999 or decimal_places > 1:
            raise ValidationError('Some Number must be less than or equal to 999 and have only one decimal place')

烧瓶模板

<form method="POST" action="{{ url_for('someTemplate') }}">
    <div>
        <label for="{{ form.someNumber.id }}">{{ form.weight.label }}</label>
        {{ form.someNumber }}
    </div>
    {% for error in form.someNumber.errors %}
    <div class="alert alert-danger">
        {{ error }} debugging info: {{ form.someNumber.data }}
    </div>
    {% endfor %}
</form>

最后是我的路线

@app.route("/someTemplate", methods=['GET', 'POST'])
def someTemplate():
    form = MyForm()
    if form.validate_on_submit():
        flash(f"You have submitted an entry", "success")
        print(form.data)
        return render_template("someTemplate.html", form=form)
    return render_template("someTemplate.html", form=form)

然后我尝试提交像“totallyNotNumeric”这样的输入,UI 呈现

DataRequired
警告消息,“此字段为必填项”。 为什么它不引发“这不是一个有效的浮点数”消息呢?

那似乎是最接近字段类的消息。我在没有验证器的情况下测试了一个普通的

FloatField
,当我尝试使用字母数字输入时,它将“...不是有效的浮点数”消息传递给了错误列表???

此外,我注意到我的自定义验证器有效。输入类似“111.111”的内容时。我收到自定义错误消息。所以我想让我也尝试在我的自定义验证器中验证数据类型。所以我修改成这样:

if field.data is not None:
    whole_number = None
    decimal_places = None
    if isinstance(field.data, (int, float)):
        whole_number = int(field.data)
        decimal_places = len(str(field.data).split('.')[1]) if '.' in str(field.data) else 0
     else:
        raise ValidationError('someNumber must be a number')

    if whole_number > 999 or decimal_places > 1:
        raise ValidationError('someNumber must be less than or equal to 999 and have only one decimal place')

这没有用。有什么建议吗?我是否遗漏了一些超级简单的东西或误解了烧瓶形式的核心概念?重量形式?谢谢

flask flask-wtforms wtforms customvalidator
1个回答
0
投票

这里没有具体理由要使用DataRequired验证器。从

DataRequired
更改为
InputRequired
,它应该给您熟悉的错误消息“这不是有效的浮点数”。

© www.soinside.com 2019 - 2024. All rights reserved.