如果您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()
没有动态添加的字段。因此,此字段不能成为表单验证过程的一部分。
如何正确解决此问题?如果不可能,那么如何动态地将字段添加到现有表单中,以便在提交时正确验证所有字段?
答案 0 :(得分:0)
由于您在添加字段之前致电validate()
,因此您无法验证尚未存在的字段。也就是说,您不想将字段添加到实例而不是类。这是因为由于WTForms在构造时处理其输入数据,因此向实例添加字段主要是毫无意义的事情。
如果您的字段名称是静态的,则可以使用del
详细here
如果它是动态的,您可以关注文档中的dynamic form composition pattern。
由于我已经详细介绍了这一点,我将在此处链接我之前的示例: Wtfforms dynamic generation