我不太确定如何处理此问题。我希望我能到达那里。
例如,我在一个页面上有一张充满地址的表。这些计数是动态的(可以是5或10或任何其他计数)。我希望可以在一页上进行编辑。
我的方法是创建wtforms一个表单编辑一个地址,并乘以它在Jinja2的for loop
和附加到HTML propertysname
并id
在loop.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
参数手动传递给field函数,因为wtformsname
从初始形式的变量名称创建了html-paramter。
因此,有一种方法可以在要呈现的表单名称中添加前缀或后缀。还是这是一个XY问题,我的方法是完全错误的。
还是我自己一个人做(我真的在努力避免这种情况)
WTForms有一个称为的元字段FormField
,另一个有的元字段FieldList
。将两者结合在一起,您将获得想要的:
class AddressEntryForm(FlaskForm):
name = StringField()
class AddressesForm(FlaskForm):
"""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)
然后,在您的模板中,只需遍历子表单:
{% from 'your_form_template.jinja' import forms %}
{% for address_entry_form in form.addresses %}
{{ address_entry_form.hidden_tag() }}
{# Flask-WTF needs `hidden_tag()` so CSRF works for each form #}
{{ forms.render_field(address_entry_form.name) }}
{% endfor %}
WTForms会自动为名称和ID正确加上前缀,因此,当您将数据回发时,您将能够获取form.addresses.data
和获取包含更新数据的词典列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句