使用 wtforms 动态添加输入字段
Add input fields dynamically with wtforms
我不太确定如何处理这件事。我希望我能到达那里。
例如,我在一个页面上 table 满是地址。这些的计数是动态的(可以是 5 或 10 或任何其他计数)。我希望可以在一页上编辑它们。
我的方法是用 wtforms 创建一个表单来编辑一个地址并乘以
它在 jinja2 for loop
中并附加到 html 属性 name
和 id
loop.index0
来自迭代,所以我可以手动提取每一行数据
并在我想对其进行评估时将其放回我的表格中。
所以这个例子的表格是:
class AdressForm(Form):
name = TextField()
所以现在我的模板方法如下所示(分解为一个输入字段):
{% 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的字段函数的权利类。就像他们在许多教程中使用的那样)
所以这是行不通的,因为您不能将 name
参数手动传递给字段函数,因为 wtforms 从初始表格。
那么有没有办法为我要呈现的表单的名称添加前缀或后缀。
或者这是 XY 问题,我的方法完全错误。
还是我自己一个人做(我真的尽量避免这种情况)
WTForms 有一个名为 FormField
and another meta-field called FieldList
的元字段。这两者结合在一起将为您提供所需的东西:
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 正确添加前缀,因此当您 post 返回数据时,您将能够 form.addresses.data
并返回包含更新数据的字典列表.
works great for StringFields
(previously TextField
), but things get a little trickier for dynamic SelectFields
. For anyone interesting in how to implement dynamic SelectFields
with wtforms
, see
我不太确定如何处理这件事。我希望我能到达那里。
例如,我在一个页面上 table 满是地址。这些的计数是动态的(可以是 5 或 10 或任何其他计数)。我希望可以在一页上编辑它们。
我的方法是用 wtforms 创建一个表单来编辑一个地址并乘以
它在 jinja2 for loop
中并附加到 html 属性 name
和 id
loop.index0
来自迭代,所以我可以手动提取每一行数据
并在我想对其进行评估时将其放回我的表格中。
所以这个例子的表格是:
class AdressForm(Form):
name = TextField()
所以现在我的模板方法如下所示(分解为一个输入字段):
{% 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的字段函数的权利类。就像他们在许多教程中使用的那样)
所以这是行不通的,因为您不能将 name
参数手动传递给字段函数,因为 wtforms 从初始表格。
那么有没有办法为我要呈现的表单的名称添加前缀或后缀。 或者这是 XY 问题,我的方法完全错误。
还是我自己一个人做(我真的尽量避免这种情况)
WTForms 有一个名为 FormField
and another meta-field called FieldList
的元字段。这两者结合在一起将为您提供所需的东西:
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 正确添加前缀,因此当您 post 返回数据时,您将能够 form.addresses.data
并返回包含更新数据的字典列表.
StringFields
(previously TextField
), but things get a little trickier for dynamic SelectFields
. For anyone interesting in how to implement dynamic SelectFields
with wtforms
, see