我想在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 +)下解决这个问题吗?
答案 0 :(得分: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,
)
模板将打印函数返回的任何内容。 该函数不知道哪个模板正在调用它或模板上下文,只是您作为参数传递的内容。