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

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

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

正如您可能假设的那样,articles_list1articles_list2是两个不同的列表,但是我可以重用使用 articles变量的非常相同的 list.html模板。

我正在尝试使用 Jinja2实现同样的功能,但是我不知道推荐的方法是什么,因为不支持 with关键字。

70095 次浏览

Jinja2 has an extension that enables the with keyword - it won't give you the same syntax as Django, and it may not work the way you anticipate but you could do this:

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

However, if list.html is basically just functioning as a way to create a list then you might want to change it to a macro instead - this will give you much more flexibility.

{% 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) }}

To use this macro from another template, import it:

{% from "build_list_macro_def.html" import build_list %}

This way you can pass multiple variables to Jinja2 Include statement - (by splitting variables by comma inside With statement):

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

For readers in 2017+, Jinja as of 2.9 includes the with statement by default. No extension necessary.

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

In older versions of Jinja (before 2.9) it was required to enable this feature with an extension. It’s now enabled by default.

Updated 2021+

Included templates have access to the variables of the active context by default. For more details about context behavior of imports and includes, see Import Context Behavior.

From Jinja 2.2 onwards, you can mark an include with ignore missing; in which case Jinja will ignore the statement if the template to be included does not exist. When combined with with or without context, it must be placed before the context visibility statement. Here are some valid examples:

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

Another option, without plugins, is to use macros and include them from another file:

file macro.j2

{% macro my_macro(param) %}
\{\{ param }}
{% endmacro %}

file main.j2

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


\{\{ my_macro(param) }}