使用WTForms验证列表中的每个值

4
使用 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,我只会得到与给定字段关联的一个值而不是整个列表。

当我想要验证提交的值时,问题就出现了:form.validate()方法只会验证列表的第一个值,而第二个值则不会受到任何验证。

我的问题:有什么办法可以验证列表中每个值吗?

提前感谢!

1个回答

4

您需要使用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>

谢谢!还有一个子问题:您能解释一下 form = AForm(request.form, ff=entries) 吗?特别是 ff=entries 是什么意思:对于 FieldList,您必须产生条目的数量,这正确吗? - mannaia
request.form中没有提供数据时,ff=entries应该设置条目 - 否则,由于最小条目数为0,将不会显示任何字段。如果您始终希望有最少数量的条目,则可以更改ff的声明以指定字段的最小数量ff = FieldList(field, min=3)(例如). - Sean Vieira
没错,那个可行...只需要在FieldList定义中将min替换为min_entries即可。 - mannaia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接