我正在使用 FormFields 的 FormList 在 Flask 中动态填充表单,但由于验证函数出现错误而不知所措。在此表单上,用户提供一个条目名称,然后为从数据库表中查询的每个游戏,从 RadioField 中选择一个,并将他们对选择的信心排名 1-N。我已经使用硬编码的测试对验证进行了测试,并且我已经让下面的动态字段生成工作,但是当我尝试验证下面的内容时,它在迭代games-#-pick
with时失败'NoneType' is not iterable
。
我相信这是因为循环不断超出我的范围。在我的测试中,我只有三个条目games
,0,1,2 也是如此idx
,我应该看到生成了三个 PickForms。当 validate 失败时,我看到self.name
is 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