この問題にどのようにアプローチするかはよくわかりません。私はそこに着くといいのですが。
たとえば、ページにアドレスでいっぱいのテーブルがあります。これらのカウントは動的です(5または10またはその他のカウントである可能性があります)。そして、1ページで編集できるようにしたいと思います。
私のアプローチは、編集一つのアドレスにwtformsでフォームを作成し、Jinja2の中でそれを乗算したfor loop
HTML形式のpropertysへとAPPENDname
と私はとき、手動でデータの各行を抽出し、自分の形に戻ってそれを置くことができるので、itereationから評価したいです。id
loop.index0
したがって、この例のフォームは次のようになります。
class AdressForm(Form):
name = TextField()
これで、テンプレートのアプローチは次のようになります(1つの入力フィールドに分解します)。
{% for address in addresses %}
{{ forms.render_field(addressform.name, id = "name_" ~ loop.index0,
name = "name_" ~ loop.index0, value = address.name) }}
{% endfor %}
(forms.render_fieldは、多くのチュートリアルで使用されているように、wtformsのフィールド関数に適切なクラスを指定するための単なるマクロです)
wtformsは最初のフォームの変数名からhtml- name
paramterを作成するため、パラメーターをフィールド関数に手動で渡すことができないため、これは機能しませんname
。
レンダリングしたいフォームの名前にプレフィックスまたはポストフィックスを追加する方法はありますか?それとも、これはXYの問題であり、私のアプローチは完全に間違っています。
または私はそれをすべて自分で明白にしますか(私は本当にこれを避けようとします)
WTFormsには、と呼ばれるメタフィールドとFormField
と呼ばれる別のメタフィールドがありFieldList
ます。これら2つを組み合わせると、必要なものが得られます。
class AddressEntryForm(FlaskForm):
name = StringField()
class AddressesForm(FlaskForm):
"""A form for one or more addresses"""
addresses = FieldList(FormField(AddressEntryForm), min_entries=1)
AddressesFormにエントリを作成するには、辞書のリストを使用するだけです。
user_addresses = [{"name": "First Address"},
{"name": "Second Address"}]
form = AddressesForm(addresses=user_addresses)
return render_template("edit.html", form=form)
次に、テンプレートで、サブフォームをループします。
{% from 'your_form_template.jinja' import forms %}
{% for address_entry_form in form.addresses %}
{{ address_entry_form.hidden_tag() }}
{# Flask-WTF needs `hidden_tag()` so CSRF works for each form #}
{{ forms.render_field(address_entry_form.name) }}
{% endfor %}
WTFormsは自動的に名前とIDに正しくプレフィックスを付けるため、データをポストバックするform.addresses.data
と、更新されたデータを含む辞書のリストを取得して取得することができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加