Как я могу отобразить FieldList переменной длины в WTForms? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать форму для заполнения календаря. Календарь может длиться пять или семь дней, и я хотел бы указать количество дней в качестве аргумента в форме. Моя форма определена так:

class LoadForecastForm(Form):

    def __init__(self, n_days, *args, **kwargs):
        self.n_days = n_days
        super(LoadForecastForm, self).__init__(*args, **kwargs)
        self.day_values = FieldList(SelectField('Day Values', coerce=str, choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High'), ('holiday', 'Holiday')]), min_entries=n_days, max_entries=n_days)
        self.send = SubmitField('Send Calendar')

Это выглядит так:

<form role="form" action="" method="POST">
{{ form.hidden_tag() }}
<div class="form-group row">
  {% for field in form.day_values %}
  <div class="col-sm-2">
    <div class="form-group{% if field.errors %} error {% endif %}">
      {% if label %}
        {{ field.label }}
      {% endif %}
      {{ field(**kwargs) }}
      {% for error in field.errors %}
        <span class="help-inline">[{{error}}]</span><br>
      {% endfor %}
    </div>
  </div>
  {% endfor %}
</div>
{{ form.send }}

Страница формы не отображается; трассировка заканчивается на:

File "project/populate_schedule.tpl.html", line 25, in block "page_content"
{% for field in day_values %}
TypeError: 'UnboundField' object is not iterable

n_days имел обыкновение быть жестко закодированным, и поля были определены как переменные класса без функции __init__(), и ошибок не было. Как правильно определить поле программно? Я использую Python 2.7.

1 Ответ

0 голосов
/ 01 июля 2018

Вам нужно оставить определения полей в теле класса, иначе они не будут получены при создании класса. Когда экземпляр формы инициализируется, вы можете применить максимальные / минимальные значения записей к списку полей.

class F(Form):

    day_values = FieldList(SelectField('Day Values',
                           coerce=str,
                           choices=[('low', 'Low'), ('medium', 'Medium'),
                                    ('high', 'High'), ('holiday', 'Holiday')]))
    send = SubmitField('Send Calendar')

    def __init__(self, *args, **kwargs):
        ndays = kwargs.pop('n_days')
        super(F, self).__init__(*args, **kwargs)
        self.day_values.min_entries = n_days
        self.day_values.max_entries = n_days

Тест:

n_days = 4
f = F(n_days=n_days)
for x in range(n_days):
    f.day_values.append_entry()
for field in f.day_values:
    print field()
    print

Выход:

<select id="day_values-0" name="day_values-0"><option value="low">Low</option><option value="medium">Medium</option><option value="high">High</option><option value="holiday">Holiday</option></select>

<select id="day_values-1" name="day_values-1"><option value="low">Low</option><option value="medium">Medium</option><option value="high">High</option><option value="holiday">Holiday</option></select>

<select id="day_values-2" name="day_values-2"><option value="low">Low</option><option value="medium">Medium</option><option value="high">High</option><option value="holiday">Holiday</option></select>

<select id="day_values-3" name="day_values-3"><option value="low">Low</option><option value="medium">Medium</option><option value="high">High</option><option value="holiday">Holiday</option></select>
...