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


76

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

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

正如你可能会假设,articles_list1并且articles_list2是两个不同的列表,但我可以重复使用同样的list.html将被使用模板articles变量。

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

Answers:


34

对于2017年及以后的读者,Jinja截至默认2.9包含该with声明。无需扩展名。

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

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


好吧,我发现自己在2017年是行不通的。麻烦提供链接吗?
Pithikos

1
“ @Pithikos jinja.pocoo.org/docs/2.9/templates/#with-statement ”在Jinja的较早版本(2.9之前)中,需要使用扩展名启用此功能。默认情况下已启用。
Yuji'Tomita'Tomita

127

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

60

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

            {% with var_1=123, var_2="value 2", var_3=500 %}
                {% include "your_template.html" %}
            {% endwith %}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.