【发布时间】:2018-08-03 15:25:44
【问题描述】:
我正在使用 Flask 和 WTForms 创建一个测验 web 应用程序,其中向用户显示他们可以回答的测验。测验的问题来自数据库,因此让用户回答测验的形式是动态的。下面是表单类的样子:
class QuizForm(FlaskForm):
answers = FieldList(RadioField('Correct Answer', choices=CHOICES,
validators=[DataRequired()]),
min_entries=0)
submit = SubmitField('Submit your answers')
在提供表单之前,我将条目附加到字段列表中,如下所示:
questions = Question.query.all()
form = QuizForm()
for i, question in enumerate(questions):
form.answers.append_entry()
choices = [('1', question.option_a),
('2', question.option_b),
('3', question.option_c),
('4', question.option_d)]
form.answers.entries[i].choices = choices
这很好用,可以按我的预期创建表单。但是,我无法在我想确保用户回答所有问题的地方进行验证。这就是我目前验证表单的方式:
questions = Question.query.all()
form = QuizForm(request.form)
if request.method == 'POST':
if form.validate() and len(form.answers.entries) == len(questions):
# use form data
我遇到的问题是:
- 理想情况下,我希望仅使用
form.validate()进行验证。 - 在当前方法中,
field.errors的值未设置,因此我无法向用户显示包含问题选项的单选字段正下方需要字段的消息(使用 WTForms 验证) .
完整代码见github。
为这个用例实现验证的好方法是什么?
【问题讨论】:
-
与我在这里回答的非常相似:stackoverflow.com/questions/50882720,还有另一个问题stackoverflow.com/questions/51048153。也许这些会给你一些想法
-
@Attack68 - 感谢分享这些。结论是使用setattr()动态创建表单类就可以解决问题了。这是否也确认使用 FieldList 无法进行验证?
标签: python flask flask-wtforms