我的应用程序中有几个模型,因为我会有一些视图做同样的事情(表单+表格显示我模型中的现有记录),但由于模型的不同而实现,在每种情况下都会有所不同,我想知道是否有可能使它成为通用的。
我用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 %}
有可能吗?我怎样才能做到这一点?
答案 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 %}