使用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>
Flask视图
@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()
方法只验证列表的第一个值,而第二个值不会进行任何验证。
我的问题:如何验证列表的每个值?
提前致谢!
答案 0 :(得分:3)
您需要使用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>