如何将选定的命名参数传递给 Jinja2 的包含上下文?

Posted

技术标签:

【中文标题】如何将选定的命名参数传递给 Jinja2 的包含上下文?【英文标题】:How to pass selected, named arguments to Jinja2's include context? 【发布时间】:2012-03-13 09:10:57 【问题描述】:

使用 Django 模板引擎,我可以在使用命名参数设置自定义上下文时包含另一个部分模板,如下所示:

% include "list.html" with articles=articles_list1 only %
% include "list.html" with articles=articles_list2 only %

您可能会认为,articles_list1articles_list2 是两个不同的列表,但我可以重复使用相同的 list.html 模板,该模板将使用 articles 变量。

我正在尝试使用 Jinja2 实现相同的目标,但我看不到推荐的方法是什么,因为不支持 with 关键字。

【问题讨论】:

【参考方案1】:

Jinja2 具有启用 with 关键字的 an extension - 它不会为您提供与 Django 相同的语法,并且它可能无法按您预期的方式工作,但您可以这样做:

% with articles=articles_list1 %
    % include "list.html" %
% endwith %
% with articles=articles_list2 %
    % include "list.html" %
% endwith %

但是,如果 list.html 基本上只是用作创建列表的一种方式,那么您可能希望将其更改为 macro - 这将为您提供更大的灵活性。

% macro build_list(articles) %
    <ul>
        % for art in articles %
            <li>art</li>
        % endfor %
    </ul>
% endmacro %

# And you call it thusly #
 build_list(articles_list1) 
 build_list(articles_list2) 

要从另一个模板中使用此宏,请将其导入:

% from "build_list_macro_def.html" import build_list %

【讨论】:

最后的链接指向答案本身! 根据文档,它现在包含在 2.9 中,不再需要作为扩展加载【参考方案2】:

这样您可以将 多个变量 传递给 Jinja2 Include 语句 - (通过在 With 语句中用逗号分割变量):

            % with var_1=123, var_2="value 2", var_3=500 %
                % include "your_template.html" %
            % endwith %

【讨论】:

【参考方案3】:

对于 2017 年以上的读者,Jinja 自 2.9 起默认包含 with 语句。无需扩展。

http://jinja.pocoo.org/docs/2.9/templates/#with-statement

在旧版本的 Jinja(2.9 之前)中,需要通过扩展启用此功能。现在默认启用。

【讨论】:

好吧,我发现自己在 2017 年,但它不起作用。麻烦提供链接? @Pithikos jinja.pocoo.org/docs/2.9/templates/#with-statement “在旧版本的 Jinja(2.9 之前)中,需要通过扩展启用此功能。现在默认启用。”

以上是关于如何将选定的命名参数传递给 Jinja2 的包含上下文?的主要内容,如果未能解决你的问题,请参考以下文章

如何将命名参数传递给 Rake 任务?

如何使用 Terraform local-exec 将命名参数传递给 powershell 脚本?

如何使用 ODBC 将多个命名参数传递给 DB2 数据库

使用颤振将多个参数传递给命名路由

将引用作为命名参数传递给可变参数函数的问题

有条件地将任意数量的默认命名参数传递给函数