如何使用FormFields的WTForms FieldList?
我正在使用Flask构建网站,在其中使用WTForms。在表单中,我现在要使用FormFields的FieldList,如下所示:
class LocationForm(Form):
location_id = StringField('location_id')
city = StringField('city')
class CompanyForm(Form):
company_name = StringField('company_name')
locations = FieldList(FormField(LocationForm))
因此,为了使人们能够进入具有两个地点的公司(稍后会动态添加地点),我在正面进行了此操作:
<form action="" method="post" role="form">
{{ companyForm.hidden_tag() }}
{{ companyForm.company_name() }}
{{ locationForm.location_id() }}
{{ locationForm.city() }}
{{ locationForm.location_id() }}
{{ locationForm.city() }}
<input type="submit" value="Submit!" />
</form>
所以在提交时,我打印位置:
print companyForm.locations.data
但我明白了
[{'location_id': u'', 'city': u''}]
我可以使用locationForm打印第一个位置的值(请参见下文),但是我仍然不知道如何获取第二个位置的数据。
print locationForm.location_id.data
print locationForm.city.data
因此,位置列表确实有一个带空值的字典,但是:
- 为什么位置列表中只有一个字典而不是两个字典?
- 为什么位置dict中的值是空的?
有人知道我在做什么错吗?欢迎所有提示!
-
对于初学者,FieldList有一个名为的参数
min_entries
,它将为您的数据腾出空间:class CompanyForm(Form): company_name = StringField('company_name') locations = FieldList(FormField(LocationForm), min_entries=2)
这将按照您需要的方式设置列表。接下来,您应该直接从
locations
属性中渲染字段,以便正确生成名称:<form action="" method="post" role="form"> {{ companyForm.hidden_tag() }} {{ companyForm.company_name() }} {{ companyForm.locations() }} <input type="submit" value="Submit!" /> </form>
查看呈现的html,输入应具有像
locations-0-city
这样的名称,这样WTForms将知道是哪个。或者,对于元素的自定义呈现
{% for l in companyForms.locations %} {{ l.form.city }} {% endfor %}
(仅在wtforms中
l.city
是的简写l.form.city
。但是,该语法似乎与Jinja冲突,因此有必要l.form.city
在模板中使用显式。)现在准备好提交的数据,只需创建
CompanyForm
和遍历以下位置:for entry in form.locations.entries: print entry.data['location_id'] print entry.data['city']