Agregue campos dinámicamente al formulario WTForms

Quiero definir una clase de formulario con campos basados ​​en un dict de name: label . Intenté lo siguiente, que casi funcionó. Sin embargo, la representación de los campos en una plantilla dio a AttributeError: 'UnboundField' object has no attribute '__call__' . ¿Cómo puedo agregar campos dinámicamente a un formulario?

 def build_form(name, record): class ContactForm(FlaskForm): name = StringField(name) fieldlist = {} for key, value in record.items(): fieldlist[key] = StringField(key) @app.route('/', methods=['GET', 'POST']) def showform(): form = ContactForm(request.form) if request.method == 'POST': return 'form processed' return render_template('cardcompare.tpl', record=record, form=form) 
  {{ form.name() }} {% for key, value in record.items() %} {{ form.fieldlist[key]() }} {% endfor %}   

Use setattr para agregar nuevos campos como atributos de la clase de formulario. Esto hará que WTForms configure el campo correctamente en lugar de mantener el campo no enlazado.

 # form class with static fields class MyForm(FlaskForm): name = StringField('static field') record = {'field1': 'label1', 'field2': 'label2'} # add dynamic fields for key, value in record.items(): setattr(MyForm, key, StringField(value)) 

En la plantilla puede iterar sobre los campos usando el filtro attr .

 {% for key, value in record.items() %}: {{ form|attr(key)() }} {% endfor %}