通过jinja模板中的模型字段进行迭代

时间:2013-10-06 20:14:07

标签: flask jinja2 flask-sqlalchemy

我的应用程序中有几个模型,因为我会有一些视图做同样的事情(表单+表格显示我模型中的现有记录),但由于模型的不同而实现,在每种情况下都会有所不同,我想知道是否有可能使它成为通用的。

我用Google搜索了一下,无法找到与我的案例有关的任何内容。 我想要实现的目标:

在我看来,我想从我传递给模板的模型中浏览每个对象,例如:

return render_template('addstatus.html', form=form, statuses=Status.query.all(), 
        target_model="Status", fields=Status.__mapper__.c.keys())

但我希望只有一个视图,无论模型是什么,所以我无法提前知道模型的字段,列数等等。

我想在我看来有类似的东西:

{% for obj in objects %}
   {% for field in obj.fields %} (not existing)
      <h1> {{ field }} :: {{ obj.fields.field.value }}
   {% endfor %}
{% endfor %}

有可能吗?我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:4)

您可以将此方法添加到db.Model类(通过子类化或monkeypatching):

from sqlalchemy.orm import class_mapper, ColumnProperty
def columns(self):
    """Return the actual columns of a SQLAlchemy-mapped object"""
    return [prop.key for prop in class_mapper(self.__class__).iterate_properties
            if isinstance(prop, ColumnProperty)]

然后,您可以使用{% for col in obj.columns() %}迭代列名称。

答案 1 :(得分:0)

我有一个类似的问题,并希望纯粹以Jinja2为基础。这将返回&#34; obj&#34;中的所有键/字段。桌子,对我来说效果很好:

obj.__table__.columns._data.keys()

此处将在您的示例代码中实现

{% for obj in objects %}
    {% for field in obj.__table__.columns._data.keys() %}
        <h1> {{ field }} :: {{ obj[field] }} </h1>
    {% endfor %}
{% endfor %}