动态WTForm字段未经过验证

时间:2017-08-23 21:10:40

标签: python flask wtforms flask-wtforms

如果您dynamically add a field to a WTForms form,则不会验证新添加的字段(即使您添加验证程序)。

例如,在Flask中:

@app.route('/add', methods=['GET', 'POST'])
def add():
    if 'state' not in session:
        session['state'] = 1

    form = MyForm()

    if request.method == 'POST' and form.validate():
        if session['state'] == 1:
            setattr(
                MyForm,
                'asd',
                StringField(
                    'asdfield',
                    validators = [
                        DataRequired(),
                        Length(min=1)
                    ]
                )
            )
            form = MyForm()
            session['state'] = 2
            return render_template(
                'add.html',
                form=form
            )
        print(len(form.asd.data)) # can equal 0
        session['state'] = 1
        return redirect('/add')
    return render_template(
        'add.html',
        form=form
    )

我认为这是因为每次转到form = MyForm()时都会运行/add,所以即使session['state'] == 2您在默认表单上运行form.validate()没有动态添加的字段。因此,此字段不能成为表单验证过程的一部分。

如何正确解决此问题?如果不可能,那么如何动态地将字段添加到现有表单中,以便在提交时正确验证所有字段?

1 个答案:

答案 0 :(得分:0)

由于您在添加字段之前致电validate(),因此您无法验证尚未存在的字段。也就是说,您不想将字段添加到实例而不是。这是因为由于WTForms在构造时处理其输入数据,因此向实例添加字段主要是毫无意义的事情。

如果您的字段名称是静态的,则可以使用del详细here

的技巧

如果它是动态的,您可以关注文档中的dynamic form composition pattern

由于我已经详细介绍了这一点,我将在此处链接我之前的示例: Wtfforms dynamic generation