动态 WTForm 字段未验证

Dynamic WTForm field is not validated

如果你,新添加的字段不会被验证(即使你添加了验证器)。

例如,在 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() 在没有动态添加字段的默认表单上。因此,该字段不能成为表单验证过程的一部分。

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

由于您在添加字段之前调用了 validate(),自然地,您无法验证尚不存在的字段。也就是说,您不想将字段添加到 实例 而不是 class。这是因为WTForms在构造时处理它的输入数据,所以在实例中添加字段基本上是一件没有意义的事情。

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

如果它是动态的,您可以改为遵循文档中的 dynamic form composition pattern

由于我已经详细介绍了这一点,因此我将 link 我之前的例子放在这里: