如何在 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 的标签的主要内容,如果未能解决你的问题,请参考以下文章

django 在模板中实现过滤器

如何做类似 Django 模型的元类技巧

如何在 Django 中实现追随者/追随者

你将如何在 django 中实现聊天?

如何在 Django 模板中实现面包屑?

如何在django模板中实现列表迭代[重复]