2016-02-12 39 views
0

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

这里是一个原始添加条目形式例如形式:

@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

为什么你不在项目表单中包含一个城市字段? – m1yag1

回答

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) 

这将有效地节约城市的外键的数据库字段。

相关问题