【问题标题】:Add fields dynamically to WTForms form将字段动态添加到 WTForms 表单
【发布时间】:2017-10-07 04:24:56
【问题描述】:

我想定义一个表单类,其字段基于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)
<form method=post>
    {{ form.name() }}
    {% for key, value in record.items() %}
        {{ form.fieldlist[key]() }}
    {% endfor %}
    <input type=submit value=Register>
</form>

【问题讨论】:

    标签: python flask wtforms flask-wtforms


    【解决方案1】:

    使用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 %}
    

    【讨论】:

    • 谢谢,有没有办法将动态字段添加到可以在模板中迭代的结构中? (例如,例如示例中的字段列表)?目标是处理动态字段与模板中的静态字段不同。
    • 那部分被编辑过分急切地删除了。我把它找回来了。
    • 我通过将setattr 放在 MyForm 的__init__ 中来做了同样的事情,因为我需要将属性列表传递给表单,除了第一次运行它之外它工作,你知道为什么吗?
    • 您需要将这些字段添加到类中,而不是实例中。这意味着,调用MyForm()之前。
    • @Feodoran 我已经添加到课程中,但它仅在提交第二个表单后才有效。请在这里看看我的问题:stackoverflow.com/questions/2583620/…
    猜你喜欢
    • 2012-07-03
    • 2015-02-14
    • 2011-11-08
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2015-04-07
    • 2011-10-05
    • 2016-08-26
    相关资源
    最近更新 更多