根据WTForms中的数据设置select元素

时间:2015-05-31 06:13:55

标签: flask wtforms flask-wtforms

我需要在页面加载时根据数据库中的数据设置一个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
  )

0 个答案:

没有答案