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



在许多示例中,我注意到要编辑现有数据,可以使用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>

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

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

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)

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

最新更新