如何使用表单域的WTForms字段列表?

2024-09-28 21:57:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Flask构建一个网站,其中使用WTForms。在表单中,我现在要使用表单域的字段列表,如下所示:

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值为空,但是:

  1. 为什么位置列表只有一个,而没有两个dict?
  2. 为什么位置dict中的值是空的?

有人知道我做错了什么吗?欢迎所有小费!


Tags: nameformid表单city列表datalocation
1条回答
网友
1楼 · 发布于 2024-09-28 21:57:24

首先,有一个名为min_entriesFieldList参数,它将为您的数据腾出空间:

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.cityl.form.city的缩写。但是,这种语法似乎与Jinja冲突,因此有必要在模板中使用显式的l.form.city

现在要准备提交的数据,只需创建CompanyForm,并在以下位置迭代:

for entry in form.locations.entries:
    print entry.data['location_id']
    print entry.data['city']

相关问题 更多 >