如何向Jinja2的include上下文传递选定的命名参数?

107

我可以使用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关键字。

5个回答

162
Jinja2有一个扩展可以启用with关键字-它不会给你与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 %}

链接末尾指向答案本身! - alamoot
4
根据文档,此功能现已包含在2.9中,不再需要作为扩展加载。 - Noah Sparks

75

通过在 With 语句内使用逗号分隔变量,您可以将 多个变量 传递给 Jinja2 的 Include 语句:

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

然后在 .html 文件中如何访问这些变量? - Ahmed Hasn.
2
@AhmedHasn. {{var_name}} - David Mendes

48

我发现自己在2017年了,但它还是无法工作。需要提供一个链接吗? - Pithikos
2
在Jinja的旧版本(2.9之前),需要使用扩展程序来启用此功能。现在它已默认启用。@Pithikos http://jinja.pocoo.org/docs/2.9/templates/#with-statement - Yuji 'Tomita' Tomita

13

更新于 2021年以后

包含的模板默认可以访问活动上下文的变量。有关导入和包含的上下文行为的更多详细信息,请参见导入上下文行为

从Jinja 2.2开始,您可以使用ignore missing标记一个包含文件;在这种情况下,如果要包含的模板不存在,则Jinja将忽略该语句。当与withwithout context结合使用时,它必须放置在上下文可见性语句之前。下面是一些有效的示例:

{% include "sidebar.html" ignore missing %}
{% include "sidebar.html" ignore missing with context %}
{% include "sidebar.html" ignore missing without context %}

1
你能解释一下“带上下文”、 “不带上下文”和“无语句”(用于与Django一起使用的Jinja2)之间的区别吗?还有没有包含“ignore missing”的版本? - Adam Jagosz
你能解释一下在 Django 中使用 Jinja2 时 with contextwithout context 和无语句的区别吗?还有没有 ignore missing 的版本? - Adam Jagosz

2
另一种无需插件的选择是使用宏并从另一个文件中包含它们:
文件 macro.j2
{% macro my_macro(param) %}
  {{ param }}
{% endmacro %}

文件main.j2

{% from 'macro.j2' import my_macro %}

{{ my_macro(param) }}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接