如何在Jinja中实现类似Django的标签

时间:2015-05-16 12:15:58

标签: python django jinja2

我想在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 个答案:

答案 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,
    )

模板将打印函数返回的任何内容。 该函数不知道哪个模板正在调用它或模板上下文,只是您作为参数传递的内容。