Python - Flask WTF - несколько уровней FieldList не заполняются

У меня возникла небольшая проблема с получением формы, сгенерированной Flask WTF, в соответствии с тем, что я представляю. Это находится в его основе, это приложение - система резервирования, это просто случается для кабинок печенья девочки-разведчика для единицы обслуживания моей дочери. И это означает, что по логике есть "будка", которую отряд может зарезервировать. Имеет форму, которая просто перечисляет доступные киоски, работает, но это не совсем идеальный UI/UX и вызывает много дополнительной прокрутки для пользователей. То, что я пытаюсь сделать, это сжать пользовательский интерфейс во что-то, что объединяет все, например, дни и места, чтобы сэкономить место на странице. Это будет в основном выглядеть

Date1
Location1 ()Time1 ()Time2 ... ()TimeN
Location2 ()Time1 ()Time2 ... ()TimeN
.
.
.
LocationN ()Time1 ()Time2 ... ()TimeN

Date2
Location1 ()Time1 ()Time2 ... ()TimeN
Location2 ()Time1 ()Time2 ... ()TimeN
.
.
.
LocationN ()Time1 ()Time2 ... ()TimeN
.
.
.
DateN
Location1 ()Time1 ()Time2 ... ()TimeN
Location2 ()Time1 ()Time2 ... ()TimeN
.
.
.
LocationN ()Time1 ()Time2 ... ()TimeN

То, что у меня есть, так это форма, которая выглядит так:

class BoothLocationForm(FlaskForm):
    booth_location = StringField('Booth Location')
    timeslot = RadioField('Reserve this time', id='reserve_booth', coerce=int, choices = [('64', '15:00'), ('61', '17:00'), ('19', '19:00'), ('55', '21:00'), ('58', '23:00')])


class BoothDateForm(FlaskForm):
    booth_date = StringField('Date')
    booth_locations = FieldList(FormField(BoothLocationForm))


class MultiBoothDateForm(FlaskForm):
    troop = SelectField('Troop Reserving', validators=[DataRequired()], id='select_troop', coerce=int)
    booth_dates = FieldList(FormField(BoothDateForm))

И мой шаблон формы выглядит так:

<form method="POST" action="{{ url_for('cookie_reserve_booth') }}" name="reserve_booth_form">
    {{ form.hidden_tag() }}
    <p>{{ form.troop.label }} : {{ form.troop }}</p>
    <table border="1">
        {% for date in form.booth_dates %}
        <tr><td>{{ date.booth_date.label }} : {{ date.booth_date.data }}<td></tr>
        <tr><td>
        <table border="2">
            {% for location in date.booth_locations %}
            <tr>
                <td>{{ location.booth_location.data }}</td>
                {% for time in location.timeslot %}
                <td>{{ time }} {{ time.label }}</td>
                {% endfor %}
            </tr>
            {% endfor %}
        </table>
        </td></tr>
        {% endfor %}
    </table>
    <button type="submit">Reserve</button>
</form>

наконец - маршрут выглядит так:

@app.route('/cookie_reserve_booth/', methods=['GET', 'POST'])
def cookie_reserve_booth():
    start = datetime.strptime("2017-10-04", "%Y-%m-%d")
    end = start + timedelta(days=2)
    booths = (CookieBooth.query.filter(CookieBooth.starttime >= start)
                               .filter(CookieBooth.endtime < end)
                               .order_by(CookieBooth.starttime))
    dates = set()
    locations = set()
    for i in booths:
        dates.add(i.starttime.date())
    for i in booths:
        locations.add(i.location.name)
    dates = sorted(list(dates))
    locations = sorted(list(locations))
    form = MultiBoothDateForm()
    form.troop.choices = current_user.get_troops()
    for date in dates:
        date_form = BoothDateForm()
        date_form.booth_date.data = date.strftime("%Y-%m-%d")
        for location in locations:
            # choices = [(b.id, b.starttime.strftime("%H:%M")) for b in booths
            #            if b.location.name == location and b.starttime.date() == date]
            # choices = [('64', '15:00'), ('61', '17:00'), ('19', '19:00'), ('55', '21:00'), ('58', '23:00')]
            location_form = BoothLocationForm()
            location_form.booth_location = location
            # location_form.timeslot.choices = choices
            date_form.booth_locations.append_entry(location_form)
        form.booth_dates.append_entry(date_form)
    return render_template('cookie_reserve_booth.html', form=form)

Когда все настроено таким образом, это на самом деле работает. Но это имеет жестко закодированный выбор. Когда я переключаюсь на динамический материал - даже точно такой же жестко закодированный список вариантов кортежей - добавленный в маршрут, он терпит неудачу. Я получаю ошибку о том, что NoneType не является итеративным, а это означает, что раздел выбора возвращается в ноль. Что мне не хватает?

0 ответов

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