私は 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つの辞書がありますが、次のようになります。
誰かが私がここで間違っていることを知っていますか?すべてのヒントは大歓迎です!
まず、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.city
はl.form.city
の省略形です。ただし、その構文はJinjaと競合するようで、テンプレートでは明示的にl.form.city
を使用する必要があります。)
送信されたデータの準備ができたら、CompanyForm
を作成し、場所を反復します。
for entry in form.locations.entries:
print entry.data['location_id']
print entry.data['city']