首页 文章

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

提问于
浏览
52

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

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

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

我'm trying to achieve the same thing using Jinja2, but I can'看看推荐的方式是什么,因为不支持 with 关键字 .

3 回答

  • 105

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

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

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

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

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

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

相关问题