我有一个非常简单的博客网站,由Flask和peewee orm支持。只有(降价)帖子和图片。图像具有图像文件(显然),标题和简要描述。我希望能够添加一个过滤器或标签或其他东西,并基本上把我的帖子标记为{{ img.id|3 }}
,并让它渲染图像使用id=3
中的div
,标题和说明?
答案 0 :(得分:4)
您可以使用宏和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,甚至可以从我的宏查询数据库,但这样我就将问题分开了。
答案 1 :(得分:1)
对于Jinja2,您可以使用template_filter
添加自己的过滤器。过滤器可以带参数。
如果您已在模板中包含具有链接属性的图像对象,则最好使用此属性。
如果您有这种图像的特殊路径,最好使用带有指定参数的url_for
。如果它有很多参数,你总是可以添加自定义过滤器。