尝试将
DataRequired()
和自定义验证器 validate_someNumber
附加到 FloatField
。但是当出现验证错误时,我很难理解表单字段错误的反馈。以下是我对相关领域的要求:
表格.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')
这没有用。有什么建议吗?我是否遗漏了一些超级简单的东西或误解了烧瓶形式的核心概念?重量形式?谢谢