Создание N-количества форм с помощью WTForms

Я новичок в фляге и WTForms, поэтому заранее извините.

В любом случае, я пытаюсь создать несколько форм, используя одну и ту же форму, определенную ниже в forms.py.

File_Choices = [('1', 'ex1.pdf'), ('2', 'ex2.pdf')
class Inputs(Form):
    Files = SelectField(u'File', choices=File_Choices,validators =[Required()])

Я знаком с тем, что мне нужно объявить что-то вроде: form1=Inputs(), чтобы объявить форму в views.py, однако возникает проблема, когда мне нужно объявить неизвестное количество форм и отслеживать выбранные значения.

Моя конкретная проблема заключается в том, что у меня есть список, содержащий N элементов, и каждый элемент должен соответствовать файлу, который пользователь выбирает из формы. Итак, я разбил свою проблему на то, чтобы сначала создать N форм, и подумал об использовании цикла for, подобного этому:

for i in range(len(PDF_list))
    form'i'=Input()

Таким образом, конечный продукт, если длина списка равна 5, составляет 5 входных форм, объявленных как form1, form2, form3, form4, form5. Я знаю, что это, очевидно, не работает так, как я только что закодировал его, но это функциональность, которую я пытаюсь получить, поэтому я все еще могу получить доступ к отправленным значениям, используя что-то вроде

dict(File_Choices).get(form'i'.Files.data).

Однако, вероятно, есть действительно очевидный способ сделать это, я новичок в использовании flask и WTForms, поэтому любая помощь приветствуется, и в вашем решении, если бы вы могли шаг за шагом объяснить, что вы делаете, так как я новичок, это было бы Потрясающие.


person Jaquacky    schedule 27.05.2015    source источник


Ответы (1)


Я считаю, что вам нужен FieldList.

Итак, у вас будет что-то вроде:

from wtforms.fields import FieldList

file_choices = [('1', 'ex1.pdf'), ('2', 'ex2.pdf')
class Inputs(Form):
    files = FieldList(
        SelectField(u'File', choices=file_choices, validators =[Required()]),
        min_entries = N
    )

min_entries указывает, сколько "SelectFields" должно присутствовать в форме. Таким образом, у вас есть одна форма с несколькими выпадающими полями выбора, каждое из которых имеет один и тот же список file_choices.

В вашем файле шаблона вы можете вывести все поля выбора, подобные этому (это отобразит все N полей выбора:

<html>
    <form action="" method=post>
        {{ form.files }}
        <input type="submit" />
    </form>
</html>

Вы также можете перебрать form.files и стилизовать каждый SelectField по отдельности.

Теперь, когда ваша форма опубликована, вы можете получить доступ к каждому SelectField, перебирая form.files следующим образом:

for select_field in form.files:
    print(select_field.data)

Вы также можете получить доступ к SelectField с помощью индекса. Чтобы получить доступ к третьему SelectField:

form.files[2].data

вернет «1» или «2» в зависимости от того, какой файл пользователь выбрал в этом SelectField

person junnytony    schedule 27.05.2015
comment
Я вижу, что это функциональность, которую я искал, однако я все еще немного запутался в том, как получить доступ к выбранному полю от пользователя. Я попытался просмотреть документацию, но, похоже, ничего не нашел. - person Jaquacky; 28.05.2015
comment
Смотрите обновление к моему ответу. FieldLists — это, по сути, списки полей, поэтому вы можете получить доступ к полям, которые хранятся, как и к другим спискам Python: прямое индексирование, итераторы, длина. В этом случае каждый элемент в списке является SelectField. - person junnytony; 28.05.2015
comment
Да, спасибо, это именно то, что я искал! - person Jaquacky; 28.05.2015