动态将字段添加到WTForms表单

Omn*_*ver 5 python flask wtforms flask-wtforms

我想基于的字典定义带有字段的表单类name: label。我尝试了以下方法,这些方法几乎奏效了。但是,在模板中渲染字段给了AttributeError: 'UnboundField' object has no attribute '__call__'。如何动态向表单添加字段?

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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

Feo*_*ran 5

使用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))
Run Code Online (Sandbox Code Playgroud)

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

{% for key, value in record.items() %}:
    {{ form|attr(key)() }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 您需要将这些字段添加到类中,而不是实例中。这意味着,*之前* 调用`MyForm()`。 (2认同)