【问题标题】:Iterate through model fields in jinja template遍历 jinja 模板中的模型字段
【发布时间】:2013-10-06 20:14:06
【问题描述】:

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

我用谷歌搜索了一下,但找不到与我的案例相关的任何内容。 我想达到的目标:

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

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 %}

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

【问题讨论】:

  • 您似乎想要遍历模型中所有已定义的列,然后使用结果自动创建表单。看起来您正在寻找模板所需的内容,但正在寻找如何迭代列。我建议你看看thesequestions,它会给你关于如何做到这一点的想法。然后你只需要把这些想法结合在一起。
  • 我其实不想创建表单。我想创建一个 但事先不知道我的 for 循环中的模型字段和对象模型值。
  • 对不起,我应该说“HTML”而不是“表单”。但是,同样的想法也适用:您需要的唯一缺少的链接是确定如何遍历声明性 SQLAlchemy 模型中的字段。这些其他问题向您展示了如何做到这一点。
  • 哦,好的,很抱歉在再次询问之前没有进行调查。

标签: flask jinja2 flask-sqlalchemy


【解决方案1】:

您可以将此方法添加到您的 db.Model 类中(通过子类化或猴子补丁):

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() %} 来遍历列名。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,想要一些纯粹基于 Jinja2 的东西。这将返回“obj”表中的所有键/字段,对我来说效果很好:

    obj.__table__.columns._data.keys()
    

    这里是在你的示例代码中实现的

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

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 2021-05-20
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2018-05-24
      相关资源
      最近更新 更多