Динамически добавлять поля ввода с wtforms

Я не совсем уверен, как подойти к этому вопросу. Надеюсь, я доберусь туда.

например, у меня есть таблица, полная адресов на странице. Количество этих динамических (может быть 5 или 10 или любое другое количество). И мне нужна возможность редактировать их на одной странице.

мой подход заключался в создании формы с wtforms для редактирования одного адреса и умножения в jinja2 for loop и добавьте к свойствам html name и id в loop.index0 от itereation, так что я могу извлечение каждой строки данных вручную и верните его в мою форму, когда я захочу его оценить.

таким образом, форма для этого примера будет:

class AdressForm(Form):
    name = TextField()

Итак, теперь мой шаблон aproach выглядит следующим образом (разбейте на одно поле ввода):

{% for address in addresses %}
    {{ forms.render_field(addressform.name, id = "name_" ~ loop.index0, 
                          name = "name_" ~ loop.index0, value = address.name) }}
{% endfor %}

(форм.render_field - это просто макрос, чтобы указать правильные классы для функции поля wtforms. как они используют во многих учебниках)

так что это не работает, так как вы не можете передать name параметр вручную для функции поля, так как wtforms создает name html-paramter из variblename начальной формы.

Итак, есть способ добавить префикс или постфикс к имени формы, которую я хочу отобразить. Или это проблема XY, и мой подход абсолютно неправильный.

или я все это делаю сам (я действительно стараюсь этого избежать)

1 ответов


WTForms имеет мета-поле под названием FormField и еще одно мета-поле под названием FieldList. Эти два в сочетании вместе вы получите то, что вы хотите:

class AddressEntryForm(Form):
    name = TextField()

class AddressesForm(Form):
    """A form for one or more addresses"""
    addresses = FieldList(FormField(AddressEntryForm), min_entries=1)

чтобы создать записи в форме адреса, просто используйте список словарей:

user_addresses = [{"name": "First Address"},
                  {"name": "Second Address"}]
form = AddressesForm(addresses=user_addresses)
return render_template("edit.html", form=form)

затем в вашем шаблоне просто выполните цикл над подформами:

{% for address_entry_form in form.addresses %}
    {{ forms.render_field(address_entry_form.name) }}
{% endfor %}

WTForms автоматически префикс имена и идентификаторы правильно, так что при публикации данных обратно вы сможете просто получить form.addresses.data и получаем список словарей с обновленными данными.