我想在 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),你需要写 参数 1|标签(参数 2)。另外,我看不出它如何用于无参数函数。
还有完整的扩展支持,但是对于 simplest example 来说这似乎过于复杂了在文档中占用了 56 行代码。
您能解释一下您是如何在独立的 Jinja2 环境(想想静态站点生成)和新的 Django 版本 (1.8+) 下解决这个问题的吗?
请您参考如下方法:
您不会在 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,
)
模板将打印函数返回的任何内容。 该函数不知道哪个模板正在调用它或模板上下文,只知道您作为参数传递的内容。
