Flask-WTF FloatField非数值输入触发DataRequired而非类型错误排查
Flask-WTF FloatField 验证器异常问题
我给FloatField添加了DataRequired()和自定义验证器validate_someNumber,字段需满足以下要求:
- 必须填写数据
- 仅允许单个数值
- 整数部分最大为999
- 仅允许一位小数(如999.9)
相关代码
form.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])
validators.py(自定义验证器)
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')
模板文件:someTemplate.html
<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.py)
@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这类非数值内容时,页面显示的是*DataRequired()*的提示信息「This field is required」,而非预期的类型错误提示。但测试未添加任何验证器的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-WTF/WTForms的核心概念。
内容的提问来源于stack exchange,提问作者null-point-exceptional
相关产品推荐
相关产品推荐

