【发布时间】:2014-01-29 12:58:03
【问题描述】:
我有一个非常简单的博客站点,由 Flask 和 peewee orm 支持。仅(降价)帖子和图片。图像有图像文件(显然)、标题和简要说明。我希望能够添加一个 filter 或 tag 之类的东西,基本上在我的帖子的降价中放入类似{{ img.id|3 }} 的东西,并让它用id=3 在 div 中,带有标题和描述?
【问题讨论】:
我有一个非常简单的博客站点,由 Flask 和 peewee orm 支持。仅(降价)帖子和图片。图像有图像文件(显然)、标题和简要说明。我希望能够添加一个 filter 或 tag 之类的东西,基本上在我的帖子的降价中放入类似{{ img.id|3 }} 的东西,并让它用id=3 在 div 中,带有标题和描述?
【问题讨论】:
您可以使用宏和 Python 函数来实现。
首先,添加一个全局模板。
@app.template_global()
def get_image(id):
# not sure if this is the way to do it with peewee
return Image.select().where(Image.id == id).get()
这样就可以调用{{ get_image(id=3) }},获取图片对象。当然,它仍然不能解决你的问题。
要以您想要的方式生成 HTML,请创建一个 Jinja2 宏来生成您的 HTML 块。
{% macro img(id) %}
{% set obj = get_image(id) %} {# here I'm calling the template global function #}
<img src="{{ obj.url }}" />
<span class="title">{{ obj.title }}</span>
<span class="description">{{ obj.description }}</span>
{% endmacro %}
现在,您可以调用{{ img(id=3) }} 甚至{{ img(3) }} 来打印来自img 宏的HTML。
在这里,我假设您的对象为 url、title 和 description。如果您有提供图片的路线,也许您想要的是 url_for('some_route', id=id) 而不是 {{ obj.url }}。
当然,您可以从我的get_image 函数中提供 HTML,甚至可以从我的宏中查询您的数据库,但这样我就分离了关注点。
【讨论】:
对于 Jinja2,您可以使用 template_filter 添加自己的过滤器。过滤器可以带参数。
如果您在模板中已经有带有链接属性的图像对象,那么最好使用此属性。
如果您对此图像有特殊路由,最好使用带有指定参数的url_for。如果它有很多参数,你总是可以添加自定义过滤器。
【讨论】: