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

NiK*_*iKo 62 templates jinja2

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

{% include "list.html" with articles=articles_list1 only %}
{% include "list.html" with articles=articles_list2 only %}
Run Code Online (Sandbox Code Playgroud)

您可能正在假设,articles_list1并且articles_list2是两个不同的列表,但我可以重用list.html将使用该articles变量的相同模板.

我正在尝试使用Jinja2实现相同的功能,但我看不出推荐的方式,因为with关键字不受支持.

Sea*_*ira 117

Jinja2有一个扩展,可以启用with关键字 - 它不会给你与Django相同的语法,它可能无法按照你预期的方式工作,但你可以这样做:

{% with articles=articles_list1 %}
    {% include "list.html" %}
{% endwith %}
{% with articles=articles_list2 %}
    {% include "list.html" %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

但是,如果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) }}
Run Code Online (Sandbox Code Playgroud)

  • 根据文档,它现在包含在 2.9 中,不再需要作为扩展加载 (5认同)

pym*_*men 43

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

            {% with var_1=123, var_2="value 2", var_3=500 %}
                {% include "your_template.html" %}
            {% endwith %}
Run Code Online (Sandbox Code Playgroud)

  • @艾哈迈德哈斯恩。{{var_name}} (2认同)

Yuj*_*ita 25

对于2017年以上的读者,Jinja 默认2.9包括with声明.无需延期.

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

在较旧版本的Jinja(2.9之前)中,需要使用扩展来启用此功能.它现在默认启用.

  • @Pithikos http://jinja.pocoo.org/docs/2.9/templates/#with-statement “在旧版本的 Jinja(2.9 之前)中,需要通过扩展启用此功能。现在默认启用。” (2认同)

Ram*_*ush 14

2021+更新

Included templates have access to the variables of the active context by default。有关导入和包含的上下文行为的更多详细信息,请参阅导入上下文行为

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

{% include "sidebar.html" ignore missing %}
{% include "sidebar.html" ignore missing with context %}
{% include "sidebar.html" ignore missing without context %}
Run Code Online (Sandbox Code Playgroud)