【问题标题】:Basic procedure in passing ORM object to tempate将 ORM 对象传递给模板的基本过程
【发布时间】:2018-04-29 02:02:13
【问题描述】:

我正在试验https://github.com/hack4impact/flask-base 并尝试将 sqlalchemy orm 对象传递给 jinja2 模板。

我的属性模型是;

class Property(db.Model):
    __tablename__ = 'properties'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(140))
    body = db.Column(db.String(1400))
    img = db.Column(db.String(140))
    ....

在我的 main/views.py 我有:

from flask import render_template
from app import db
from app.models import Property

from . import main


@main.route('/')
def index():
    props = db.session.query(Property).all()
    return render_template('main/index.html')

我知道要将变量传递给模板,您会这样做:

    return render_template('main/index.html', pr= props)

但是尝试:

>>> type(props[0])
 <class 'app.models.property.Property'>

这似乎是要传递的错误类型的对象。我会假设你会传递更通用的东西,比如字典列表。将 sqlalchemy 对象列表传递到 jinja2 模板的最佳方法是什么?

【问题讨论】:

  • " 我假设你会传递一些更通用的东西,比如字典列表。"你为什么这么认为?你可以通过任何你想要的。
  • 是什么让你认为这是错误的类型?
  • 我可能说错了,但在我看来,人们更有可能传入常用的更通用的数据结构(列表、字典等)。传递给 jinja2 模板的内容是否有最佳实践?

标签: python flask sqlalchemy jinja2 flask-sqlalchemy


【解决方案1】:

Jinja2 可以处理传递给模板渲染器的任何类型的 Python 对象,因为它是用 Python 编写的,并且专门用于这样的工作。因此,如果您将 props 列表传递给 render_template,它将正常工作。

您可以像平常一样访问对象的方法和属性,甚至可以进行迭代:

{% for prop in pr %}
  <p>Title: {{ prop.title }}</p>
  <p>Body: {{ prop.body }}</p>
  <img src="{{ prop.image }}" />
{% endfor %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多