动态 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 我之前的例子放在这里:
如果你
例如,在 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 我之前的例子放在这里: