web-dev-qa-db-ja.com

FormFieldのWTForms FieldListを使用する方法

私は Flask を使用してWebサイトを構築しています 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))

そのため、2つの場所を持つ企業に入ることができるようにしています(場所の動的追加は後で行います)。これは前面で行います。

<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(以下を参照)を使用して最初の場所の値を印刷できますが、2番目の場所のデータを取得する方法がわかりません。

print locationForm.location_id.data
print locationForm.city.data

したがって、場所のリストには空の値を持つ1つの辞書がありますが、次のようになります。

  1. 場所のリストに2つではなく1つしか存在しないのはなぜですか?
  2. そして、なぜ場所の値が空であるのですか?

誰かが私がここで間違っていることを知っていますか?すべてのヒントは大歓迎です!

17
kramer65

まず、min_entriesと呼ばれる FieldList の引数があり、これによりデータ用のスペースが作成されます。

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のような名前が必要です。これにより、WTFormはどちらがどれであるかを認識します。

または、要素のカスタムレンダリングの場合

{% 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']
37
Jaime Gómez