23

WTFormsを使用するFlaskを使用して Web サイトを構築しています。Form では、次のように 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

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

  1. 場所のリストに dict が 2 つではなく 1 つしかないのはなぜですか?
  2. そして、なぜ場所の辞書の値が空なのですか?

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

4

2 に答える 2

53

まず、 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は の省略形です。ただし、その構文は Jinja と衝突するようであり、テンプレートでl.form.city明示的に使用する必要があります。)l.form.city

送信されたデータを準備するには、 を作成CompanyFormして場所を反復処理します。

for entry in form.locations.entries:
    print entry.data['location_id']
    print entry.data['city']
于 2015-05-12T00:10:51.650 に答える