在许多示例中,我注意到编辑现有数据,可以使用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>
答案 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)
这将有效地将城市的外键保存到数据库中的该字段中。