2017-05-09 90 views
3

我想定义一个基于字典name: label的字段的表单类。我尝试了以下,几乎工作。然而,渲染模板中的字段给了AttributeError: 'UnboundField' object has no attribute '__call__'。我如何动态添加字段到表单?将字段动态添加到WTForms表单

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 method=post> 
    {{ form.name() }} 
    {% for key, value in record.items() %} 
     {{ form.fieldlist[key]() }} 
    {% endfor %} 
    <input type=submit value=Register> 
</form> 

回答

2

使用setattr添加新的字段作为窗体类的属性。这将导致WTForms正确设置字段,而不是保留未绑定的字段。

# 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)) 

在模板中,您可以使用attr过滤器遍历字段。

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

谢谢,有没有办法让动态字段添加到可以在模板中迭代的结构? (例如在示例中的类似字段列表)?目标是处理动态字段与模板中的静态字段不同。 – Omniver

+0

该部分被编辑过分地删除了。我恢复了它。 – Feodoran

+0

我已经把'setattr'放在MyForm的'__init__'里面了,因为我需要将属性列表传递给表单,除了第一次运行时,它会工作,你知道为什么吗? – TomSawyer