Flask-WTF如何使用关系数据填充编辑表单?

时间:2016-02-12 13:28:14

标签: python flask sqlalchemy jinja2 flask-wtforms

在许多示例中,我注意到编辑现有数据,可以使用form.populate_obj输出和编辑表单数据。但我不知道它是否适用于我的情况,仍然在努力使其发挥作用。我的一些表单字段包括来自关系表的数据,其索引需要添加到此表单中。 如何将数据填充到现有表单并进行更新?我如何重构我的WTF和jinja标签以将数据填充到表单中更新它,因为我们在这里谈论关系数据?

这是一个原始的添加条目表单示例表单:

@projects.route('/add', methods=['GET', 'POST'])
def project_add():
    form = CityForm(request.form)
    form.city.choices = [('', '--- Select City ---')] + [(city.id, city.name) for city in db.session.query(City).all()]
    forms = ProjectForm()
    if forms.validate_on_submit():
        pmodel = Project(title=forms.title.data,
                         description=forms.description.data,
                         author=1,
                         posted_date=datetime.datetime.utcnow(),
# Existing form loads city name and id
                         city=form.city.data)
        db.session.add(pmodel)
        db.session.commit()
        flash('New entry was successfully posted', 'success')
        return redirect(url_for('deliverables.deliv_view', cid=pmodel.id))
    return render_template('ginn/deliverables_add.html', forms=forms, form=form)

这是模板宏:

{% macro render_field(field) %}
<dt>
    {{ field.label }}
    <dd>{{ field(**kwargs)}}
    {% if field.errors %}
    <ul class="errors">
    {% for error in field.errors %}
    <li>{{ error }}</li>
    {% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}

这是我的表单模板:

{% block body %}

{% from '_formtool.html' import render_field %}
<form method="post" enctype="multipart/form-data" class="dropzone" action="{{ url_for('projects.projects_add') }}">
    <dl>
<!-- This is an external City Form, how do I load the query to display city name from city ID? -->
        {{ render_field(form.city, id="city_select", class="city") }}
        {{ render_field(forms.title) }}
        {{ render_field(forms.description, id="textarea", class="textarea") }}
        {{ render_field(forms.started, class="datepicker") }}
    </dl>

1 个答案:

答案 0 :(得分:0)

我认为解决您问题的最佳方法是在项目表单中包含一个城市字段。在视图中即时为一个值创建一个单独的表单使这项任务过于复杂。

您可以使用上面相同的列表推导从项目表单中为该字段创建选项。

city_choices = [('', '--- Select City ---')] + [(city.id, city.name) for city in db.session.query(City).all()]

表格中的字段:

city = SelectField(u'City', validators[Required()], choices=city_choices)

这将有效地将城市的外键保存到数据库中的该字段中。