如何使用FormFields的WTForms FieldList?

发布于 2021-01-29 17:53:52

我正在使用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

因此,位置列表确实有一个带空值的字典,但是:

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

有人知道我在做什么错吗?欢迎所有提示!

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    对于初学者,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']
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看