Создание переменного количества полей формы в WTForms

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

Я пробовал использовать FieldList из FormFields, где FormField - это форма для флэш-карты. Однако я не совсем понимаю, как это работает (документы не очень полезны), и не могу создать переменное число FormFields.

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

Я был бы признателен, если бы кто-нибудь мог предоставить исправление для этих подходов или новый метод.


person Edward Allen    schedule 27.02.2016    source источник


Ответы (1)


Я предполагаю, что для каждой флеш-карты есть заголовок и некоторый контент. Типы полей формы, которые имеют наибольший смысл в этой ситуации, - это TextField и TextAreaField из WTForms. Поскольку вы работаете с Flask-WTForms, вам необходимо унаследовать базовый объект Form.

from flask.ext.wtf import Form
from wtforms import TextField, TextAreaField

class FlashCard(Form):
  title = TextField('Card title:')
  content = TextAreaField('Card content:')

Когда вы вызываете это в функции просмотра Flask:

@app.route('/')
def index():
  my_form = FlashCard()
  if my_form.validate_on_submit:
     # save flash card data here.
  return render_template('index.html', my_form=my_form)

На вашем месте я бы использовал модальное окно для формы. У Bootstrap есть модальный файл, который довольно прост в использовании (требуется Javascript). Другой вариант - перенаправить на страницу формы, когда пользователь хочет добавить флэш-карту.

Главное, что вы можете использовать один и тот же экземпляр формы для всех флеш-карт. Надеюсь это поможет.

Если вам действительно нужна динамическая композиция формы, она выглядит следующим образом (из документа WTForms):

def my_view():
    class F(MyBaseForm):
        pass

    F.username = StringField('username')
    for name in iterate_some_model_dynamically():
        setattr(F, name, StringField(name.title()))

    form = F(request.POST, ...)
    # do view stuff
person wgwz    schedule 27.02.2016