Ошибка проверки колбы "NoneType не повторяется" из RadioField в FormList FormFields?

Я динамически заполняю форму во Flask, используя FormList из FormFields, но затрудняюсь с ошибкой из функции проверки. В этой форме пользователь предоставляет имя записи, а затем для каждой игры, запрашиваемой из таблицы базы данных, выбирает ее из RadioField и оценивает свою уверенность в выборе 1-N. Я проверил валидацию с помощью теста, который был жестко запрограммирован, и я получил работу генерации динамического поля ниже, но когда я пытаюсь проверить нижеприведенное, он не проходит при итерации games-#-pick с 'NoneType' is not iterable,

Я считаю, что это потому, что цикл продолжает выходить за мои пределы. В моем тесте у меня только три записи в games, так idx равно 0,1,2, и я должен увидеть три сгенерированных PickForms. Когда проверить не удается, я вижу self.name является games-3-pickТаким образом, validate проверяет еще один FormField в моем FormList, чем я должен был сгенерировать.

Как мне это проверить? Это проблема с проверкой 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

2 ответа

Решение

Проблема закончилась тем, что я добавлял записи на form.games как для запросов GET, так и для запросов POST, в результате чего список в два раза больше, чем я хотел, а верхняя половина не заполняется. Немного больше логики, чтобы проверить текущую длину form.games прежде чем добавить запись обошлось. Возможно, это не самый элегантный из возможных способов динамического добавления этих полей, но на данный момент он работает и намного лучше, чем предыдущий способ, которым я это делал!

Я подозреваю, что вы не обращаетесь к form.games правильно. Я думаю, что вам нужно использовать: form.games.entries

Как объясняется в документации: https://wtforms.readthedocs.io/en/latest/fields.html

Извините за дерьмовое форматирование. Я нахожусь на мобильном телефоне, но все еще хочу получить очки.

Другие вопросы по тегам