使用 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>

烧瓶视图

@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>

最新更新