使用WTForms
,我要求用户输入两个数字,这两个数字将进一步用于简单的计算。这些数字都需要验证。
我定义了以下表格
class AForm(Form):
ff=DecimalField(default=0.0, validators=[NumberRange(min=0, max=2)])
模板
<form action="/test" method=post>
{% for L in entries %}
{{ render_field(form.ff) }}
{% endfor %}
<input class="button" type="submit" value="calc">
</form>
烧瓶视图
@app.route('/test', methods=['GET', 'POST'])
def get_form():
entries=[0, 1]
form = AForm(request.form)
ff_l=request.form.getlist('ff')
if request.method == 'POST' and form.validate():
L=0
v=0
a=0
b=0
for L,v in enumerate(ff_l):
a=float(v)
b+=a
return render_template('res.html', b=b)
return render_template('test.html', entries=entries, form=form)
我知道我正在使用 getlist
方法,它不是 WTForms
的一部分,但这是迄今为止找到的唯一解决方案,因为通过执行ff_l=form.ff.data
,我会得到一个dict
,每个字段只有一个值,而不是整个列表,与给定字段相关联。
当我想验证提交的值时,问题就开始了:form.validate()
方法将仅验证列表的第一个值,而第二个值将不受任何验证。
我的问题:如何验证列表的每个值?
提前感谢!
使用FieldList
让 WTForms 知道可以有多个条目:
field = DecimalField(default=0.0, validators=[NumberRange(min=0, max=2)])
class AForm(Form):
ff = FieldList(field)
然后,您应该能够在表单构造函数中简单地设置数据:
@app.route('/test', methods=['GET', 'POST'])
def get_form():
entries=[0, 1]
form = AForm(request.form, ff=entries)
ff_l = form.ff.data
if request.method == 'POST' and form.validate():
result = sum(ff_l)
return render_template('res.html', b=result)
return render_template('test.html', form=form)
您的模板现在应该遍历form.ff
中的子字段:
<form action="/test" method=post>
{% for field in form.ff %}
{{ render_field(field) }}
{% endfor %}
<input class="button" type="submit" value="calc">
</form>