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

时间:2012-02-22 23:39:26

标签: templates jinja2

使用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关键字,我无法看到推荐的方式。

3 个答案:

答案 0 :(得分:107)

Jinja2有an extension启用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) }}

答案 1 :(得分:33)

通过这种方式,您可以将多个变量传递给Jinja2 包含语句 - (在使用语句中用逗号分隔变量):

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

答案 2 :(得分:19)

对于2017年以上的读者,2.9的Jinja默认包含with语句。无需延期。

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

  

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