如何在 Jinja 中实现类似 Django 的标签
Posted
技术标签:
【中文标题】如何在 Jinja 中实现类似 Django 的标签【英文标题】:How to implement Django-like tags in Jinja 【发布时间】:2015-07-28 07:49:09 【问题描述】:我想在 Jinja 中实现与 Django 模板的自定义标签类似的功能。
在 Django 模板中,要让服务器端函数返回一个字符串并将其插入到模板中,您可以执行以下简单操作:
from django import template
register = template.Library()
@register.inclusion_tag('app/gallery.html')
def get_gallery(active=None):
### do complex server side things, etc.
context_dict =
...
return context_dict
现在,调用它就像
一样简单% load app_tags %
% get_gallery 'home' %
这对我来说似乎足够清晰和简单。
现在我的问题是:即使在阅读了 Jinja2 文档的所有部分之后,我也看不出应该如何在 Jinja 中实现类似的功能。我已经看到 Jinja 支持宏、调用、导入、自定义测试、自定义过滤器,但我看不到任何与使用任意服务器端 Python 代码定义自定义标签相关的内容。
我见过的最接近的是自定义过滤器,但是当用于类似标记的目的时,它的语法很奇怪:要调用tag(param1, param2)
,您需要编写param1|tag(param2)
。另外,我看不出它如何用于无参数函数。
还有完整的扩展支持,但由于simplest example 在文档中占用了 56 行代码,这似乎过于复杂。
你能解释一下你是如何解决这个问题的吗?无论是在独立的 Jinja2 环境(想想静态站点生成)还是在新的 Django 版本(1.8+)下?
【问题讨论】:
【参考方案1】:您不会在 Jinja 中为这些东西编写自定义标签。相反,您只需将 get_gallery
函数注册为全局 Jinja 变量并从模板中调用它:
get_gallery('home') | safe
除了全局变量,在Flask中也可以声明一个“上下文处理器”,不过思路是一样的http://flask.pocoo.org/docs/0.10/templating/#context-processors
--- 更新 ---
函数可能是这样的:
def get_gallery(gallery_uuid):
### do complex server side things, etc.
return render_template(
'app/gallery.html',
foo=bar,
)
模板将打印函数返回的任何内容。 该函数不知道调用它的模板或模板上下文,只知道您作为参数传递的内容。
【讨论】:
“get_gallery”功能是什么样的?如何在函数中指明模板路径、上下文?以上是关于如何在 Jinja 中实现类似 Django 的标签的主要内容,如果未能解决你的问题,请参考以下文章