Skip to main content
 首页 » 编程设计

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

2025年05月04日31wayfarer

我想在 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, 
    ) 

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