2015-02-06 3 views
5

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

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

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

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

class AdressForm(Form): 
    name = TextField() 

так что теперь мой шаблон выглядит Подход следующий (ломаются на один поле ввода):

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

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

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

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

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

ответ

12

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) 

Чтобы создать записи в AddressesForm, просто использовать список словарей:

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 и получить обратно список словари с обновленными данными.

+0

Thx, он работает. Только не с элементом формы с именем 'name'. С некоторыми попытками и ошибкой 'address_entry_form.name' всегда будет иметь префикс имени поля/id – muthan

+0

oh и с' type' той же проблемой – muthan

+0

Есть ли способ адаптировать это, чтобы я мог добавлять поля через шаблоны? Я бы хотел, чтобы пользователь нажал кнопку + и добавил другое поле в FieldList. –

Смежные вопросы