使用WTForms验证列表的每个值

时间:2014-03-03 18:09:22

标签: flask wtforms

使用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()方法只验证列表的第一个值,而第二个值不会进行任何验证。

我的问题:如何验证列表的每个值?

提前致谢!

1 个答案:

答案 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>
相关问题