【问题标题】:Validation on dynamically sized FieldList in WTForms验证 WTForms 中动态大小的 FieldList
【发布时间】: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

为这个用例实现验证的好方法是什么?

【问题讨论】:

标签: python flask flask-wtforms


【解决方案1】:

正如在问题中评论的更多信息:stackoverflow.com/questions/50882720 和 stackoverflow.com/questions/51048153

我个人会使用动态表单方法为所需的每个RadioField 分配一个唯一名称,以便结果类似于,例如,如果表单是静态创建的:

class WebForm(FlaskForm):
    q_1 = RadioField('Q 1', validators=[InputRequired()], ...)
    q_2 = RadioField('Q 2', validators=[InputRequired()], ...)

那么验证器肯定会按要求工作。

如果我想你可以在名为 answers 的 FieldList 上编写自己的验证器,那我就失败了。下面是一个自定义验证器的示例,它捕获一个应该捕获全名的输入字段,如果它没有检测到名称之间的空格,它就会中断:

from wtforms.validators import ValidationError
class WebForm(FlaskForm):
    fullname = StringField('Input full name', validators=[])
    def validate_fullname(self, field):
        if ' ' not in field.data:
            raise ValidationError('Please give first and last name')

如果您在 FieldList 上编写自己的验证器,您也许可以循环并检查每个验证器是否有一些数据,但更痛苦的方法(在我看来)是我陈述我喜欢这样做的原因。

【讨论】:

  • 那么,如果我们想要自动验证,那么使用set_attr是添加动态字段数的方法吗? append_entry() 有用时有用例吗?
  • 我从来没有遇到过 append_entry 并且更喜欢 setattr,因为它感觉更基本的 Python 风格。在这种情况下,它允许使用导入的验证器进行自动验证。
猜你喜欢
  • 1970-01-01
  • 2015-05-03
  • 2013-03-16
  • 2018-03-21
  • 2014-07-17
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多