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

Как бы я динамически создавал несколько полей форм с разными вопросами, но одни и те же ответы?

from wtforms import Form, RadioField from wtforms.validators import Required class VariableForm(Form): def __init__(formdata=None, obj=None, prefix='', **kwargs): super(VariableForm, self).__init__(formdata, obj, prefix, **kwargs) questions = kwargs['questions'] // How to to dynamically create three questions formatted as below? question = RadioField( # question ?, [Required()], choices = [('yes', 'Yes'), ('no', 'No')], ) questions = ("Do you like peas?", "Do you like tea?", "Are you nice?") form = VariableForm(questions = questions) 

  • Как указать строки и столбцы тега <textarea> с помощью wtforms
  • Файл фляги, не обнаруживающий при загрузке
  • Проверка валидации в WTForms не обновляется, когда база данных
  • Динамически добавлять поля ввода с помощью wtforms
  • Предварительное заполнение BooleanField, как отмечено (WTForms)
  • WTForms: Как выбрать опции в SelectMultipleField?
  • WTForms не проверяет - ошибок нет
  • Flask - WTForm - сохранить форму в db
  • 2 Solutions collect form web for “WTForms создает переменное количество полей”

    Это было в документах все время.

     def my_view(): class F(MyBaseForm): pass F.username = TextField('username') for name in iterate_some_model_dynamically(): setattr(F, name, TextField(name.title())) form = F(request.POST, ...) # do view stuff 

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

    Это не ошибка, это по дизайну. Есть много проблем с добавлением полей в создаваемые формы. Например, данные поступают через конструктор формы.

    Если вы перечитаете поток, который вы связываете, вы заметите, что вам нужно получить класс, добавить к нему поля и затем создать новый класс. Обычно вы будете делать это внутри своего обработчика.

    Ты почти там:

     CHOICES = [('yes', 'Yes'), ('no', 'No')] class VariableForm(Form): def __new__(cls, questions, **kwargs): for index, question in enumerate(questions): field_name = "question_{}".format(index) field = RadioField(question, validators=[Required()], choices=CHOICES) setattr(cls, field_name, field) return super(VariableForm, cls).__new__(cls, **kwargs) 
    Python - лучший язык программирования в мире.