0

我正在使用 FormFields 的 FormList 在 Flask 中动态填充表单,但由于验证函数出现错误而不知所措。在此表单上,用户提供一个条目名称,然后为从数据库表中查询的每个游戏,从 RadioField 中选择一个,并将他们对选择的信心排名 1-N。我已经使用硬编码的测试对验证进行了测试,并且我已经让下面的动态字段生成工作,但是当我尝试验证下面的内容时,它在迭代games-#-pickwith时失败'NoneType' is not iterable

我相信这是因为循环不断超出我的范围。在我的测试中,我只有三个条目games,0,1,2 也是如此idx,我应该看到生成了三个 PickForms。当 validate 失败时,我看到self.nameis games-3-pick,因此 validate 正在检查我的 FormList 中的一个 FormField ,而不是我应该生成的。

我如何验证这一点?这是 FormField 验证的问题,还是我如何动态地appending_entry()访问 FormList?

@bp.route('/pick', methods=['GET', 'POST'])
def pick():
    games = Game.query.order_by(Game.game_date.asc()).all()
    form = EntryForm()
    for idx, g in enumerate(games):
        form.games.append_entry()
        form.games[idx].pick.label = g.bowl_name
        form.games[idx].pick.choices = [('away', g.away), ('home', g.home)]

    if form.validate_on_submit():
       ...database writes and redirect if validated...

class PickForm(FlaskForm):
    pick =  RadioField(validators=[DataRequired()])
    weight = IntegerField('Weight', validators=[DataRequired()])

class EntryForm(FlaskForm):
    name = StringField('Entry Name', validators=[DataRequired()])
    games = FieldList(FormField(PickForm))
    submit = SubmitField('Submit')

    def validate(self):
        if not super(EntryForm, self).validate():
            return False
        result = True
        seen = set()
        for pick in self.games:
            if (pick.weight.data in seen and
                    pick.weight.data <= len(self.games)):
                pick.errors.append('Please rank reach pick from 1 to {} with no repeats.'.format(len(self.games)))
                result = False
            else:
                seen.add(pick.weight.data)
        return result
4

2 回答 2

0

我怀疑您没有正确访问 form.games。我认为你需要使用:form.games.entries

如文档中所述:https ://wtforms.readthedocs.io/en/latest/fields.html#field-enclosures

对不起,糟糕的格式。我在玩手机,但仍然想获得积分。

于 2018-01-26T10:54:43.457 回答
0

问题最终是我form.games在 GET 和 POST 请求上都附加了条目,导致列表大小是我想要的两倍,而上半部分没有填充。form.games在附加条目之前检查当前长度的更多逻辑解决了这个问题。这可能不是动态添加这些字段的最优雅的方法,但它现在可以工作并且比我之前的方法要好得多!

于 2018-01-28T20:25:08.330 回答