【问题标题】:How to implement Django-like tags in Jinja如何在 Jinja 中实现类似 Django 的标签
【发布时间】: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+)下?

【问题讨论】:

    标签: python django jinja2


    【解决方案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”功能是什么样的?如何在函数中指明模板路径、上下文?
    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多