WTForms crea variable número de campos

¿Cómo crearía dinámicamente algunos campos de formulario con diferentes preguntas, pero las mismas respuestas?

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) 

Estaba en los documentos todo el tiempo.

 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 

Lo que no me di cuenta es que los atributos de clase deben establecerse antes de que se produzca una instanciación. La claridad viene de este comentario bitbucket :

Esto no es un error, es por diseño. Existen muchos problemas al agregar campos a los formularios instanciados. Por ejemplo, los datos ingresan a través del constructor de formularios.

Si vuelve a leer el hilo que vincula, notará que necesita derivar la clase, agregar campos a eso y luego crear una instancia de la nueva clase. Normalmente harás esto dentro de tu controlador de vista.

Ya casi estás ahí:

 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)