我需要在页面加载时根据数据库中的数据设置一个select元素。
例如,如果我的数据库如下所示:
+----+--------+
| id | status |
+----+--------+
| 0 | foo |
| 1 | bar |
| 2 | baz |
+----+--------+
我想加载一个包含三行的页面,每行都有一个动态加载了foo,bar和baz的select命名状态。
如何使用数据库中的数据动态设置页面中的多个选择?
我查看了文档,但找不到内置任何内容来执行此操作。我在jinja模板中也有一个经过大量修改的字段渲染宏,我可以搞乱。
编辑:下面发布了一些代码:
表单类:
class ItemForm(Form):
status = SelectField(
"Status",
choices=[
("foo", "foo"),
("bar", "bar"),
("baz", "baz")
]
)
显示数据库中实际数据的视图(display.html
):
{% for item in items %}
<div class="id">{{ item.id) }}</div>
<div class="status">{{ form_field(itemForm.status, value=item.status) }}</div>
{% endfor %}
显示表单字段的宏:
{% macro form_field(field) -%}
{% set with_label = kwargs.pop('with_label', False) %}
{% set no_label = kwargs.pop('no_label', False) %}
{% set placeholder = '' %}
{% if not with_label %}
{% set placeholder = field.label.text %}
{% endif %}
<div class="form-group {% if field.errors %}error{% endif %}">
{% if with_label %}
<label for="{{ field.id }}" class="control-label">
{{ field.label.text }}{% if field.flags.required %} *{% endif %}:
</label>
{% endif %}
{% set class_ = kwargs.pop('class_', '') %}
{% if field.flags.required %}
{% set class_ = class_ + ' required' %}
{% endif %}
{% set prefix = kwargs.pop('prefix', '') %}
{% set postfix = kwargs.pop('postfix', '') %}
{% if prefix or postfix %}
<div class="input-group">
{% endif %}
{% if prefix %}
<div class="input-group-addon">{{ prefix }}</div>
{% endif %}
{% if field.type == 'BooleanField' %}
<label class="checkbox">
{{ field(class_=class_, **kwargs) }}
{% if with_label %}
{{ field.label.text|safe }}
{% endif %}
</label>
{% else %}
{% set class_ = class_ + ' form-control' %}
{% if field.type in ('TextField', 'TextAreaField', 'PasswordField') %}
{% set class_ = class_ + ' input-xlarge' %}
{% elif field.type == 'FileField' %}
{% set class_ = class_ + ' input-file' %}
{% endif %}
{% if field.type == "SelectField" %}
{{ field(class_=class_, placeholder=placeholder, default=2, **kwargs) }}
{% else %}
{{ field(class_=class_, placeholder=placeholder, **kwargs) }}
{% endif %}
{% endif %}
{% if postfix %}
<div class="input-group-addon">{{ postfix }}</div>
{% endif %}
{% if prefix or postfix %}
</div>
{% endif %}
{% if field.errors %}
<span class="error help-inline">{{ field.errors|join(', ') }}</span>
{% endif %}
{% if field.description %}
<p class="help-block">{{ field.description|safe }}</p>
{% endif %}
</div>
{%- endmacro %}
编辑2:下面发布的控制器代码。
控制器:
@app.route('/')
def index():
itemForm = ItemForm(request.form)
itemsQuery = Item.query.order_by().all()
return render_template(
"display.html",
items=itemsQuery,
itemForm=itemForm
)