2015-02-06 60 views
5

我不太确定如何处理此问题。我希望我能到达那里。使用wtforms动态添加输入字段

例如我有一张桌子上充满了地址。这些计数是动态的(可以是5或10或其他计数)。我希望能够在一个页面上编辑它们。

我的方法是创建wtforms表单编辑一个地址和繁殖 它在Jinja2的for loop并追加到HTML propertys nameidloop.index0从itereation,这样我就可以提取数据的每一行手动 并将其放回到我的表单中,当我想评估它时。

所以这个例子的形式是:

class AdressForm(Form): 
    name = TextField() 

所以现在我的模板的形式给出了如下所示(分解到一个输入字段):

{% for address in addresses %} 
    {{ forms.render_field(addressform.name, id = "name_" ~ loop.index0, 
          name = "name_" ~ loop.index0, value = address.name) }} 
{% endfor %} 

(forms.render_field是只是一个宏,指定wtforms字段函数的正确类,就像他们在许多教程中使用的那样)

所以这是行不通的,因为你不能通过name参数手动添加到字段函数中,因为wtforms从初始表单的variblename创建name html-paramter。

那么有没有一种方法可以将前缀或后缀添加到我想呈现的表单的名称。 或者这是一个XY-问题,我的方法是完全错误的。

或者我做这一切平原自己(我真的尽力避免这种情况)

回答

12

WTForms有荟萃场称为FormField和另一间名为场FieldList。这两个结合在一起会得到你想要的东西:

class AddressEntryForm(Form): 
    name = TextField() 

class AddressesForm(Form): 
    """A form for one or more addresses""" 
    addresses = FieldList(FormField(AddressEntryForm), min_entries=1) 

要在AddressesForm创建条目,只需使用词典列表:

user_addresses = [{"name": "First Address"}, 
        {"name": "Second Address"}] 
form = AddressesForm(addresses=user_addresses) 
return render_template("edit.html", form=form) 

然后,在你的模板,只需遍历所有的子-forms:

{% for address_entry_form in form.addresses %} 
    {{ forms.render_field(address_entry_form.name) }} 
{% endfor %} 

WTForms会自动前缀名称和的ID正确,这样当您发布的数据备份,你将能够只得到form.addresses.data并取回名单包含更新数据的字典。

+0

Thx,它的工作。只是没有名称为'name'的表单元素。有一些尝试和错误'address_entry_form.name'将始终由字段名称/编号 – muthan 2015-02-07 12:36:54

+0

的前缀哦和'类型'相同的问题 – muthan 2015-02-07 13:03:32

+0

有没有一种方法来适应这种情况,以便我可以通过模板添加字段?我想让用户点击一个+按钮,并将另一个字段添加到FieldList中。 – 2017-10-09 06:03:03