【问题标题】:Macros in django templatesdjango 模板中的宏
【发布时间】:2015-10-16 07:03:55
【问题描述】:

在 jinja 中,我可以创建宏并在我的模板中调用它,如下所示:

{% macro create_list(some_list) %}
<ul>
    {% for item in some_list %}
    <li>{{ item }}</li>
    {% endfor %}
</ul>
{% endmacro %}

HTML code....

{{ create_list(list1) }}
{{ create_list(list2) }}
{{ create_list(list3) }}

我在 django 文档中读到 django 模板没有宏标记。我对在 django 模板中执行此类操作的最佳方式感兴趣。

【问题讨论】:

    标签: python django macros jinja2


    【解决方案1】:

    正如你已经说过的,django 的模板语言中不存在宏。

    模板中有模板标签可以做更难的事情,但这也不是你要找的,因为 django 的模板系统也不允许将参数传递给函数。

    您的示例最好使用包含标签:
    https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#include

    我会这样使用它:

    模板/sn-ps/list.html

    <ul>
    {% for item in list %}
       <li>{{ item }}</li>
    {% endfor %}
    </ul>
    

    模板/index.html

    {% include 'snippets/list.html' with list=list1 %}
    {% include 'snippets/list.html' with list=list2 %}
    {% include 'snippets/list.html' with list=list3 %}
    ...
    

    【讨论】:

      【解决方案2】:

      我找到了两个可以提供的包:

      它们看起来工作方式相同:使用 pip 安装,在模板中放入 INSTALLED_APPS、{% load macros %},编写并使用它们。

      【讨论】:

        【解决方案3】:

        模板/partials/example-partial.html

        {%if partial_name == 'partial1'%}
        <ul>
        {% for item in list %}
           <li>{{ item }}</li>
        {% endfor %}
        </ul>
        {%endif%}
        
        
        {%if partial_name == 'partial2'%}
        <ul>
        {% for item in list %}
           <li>{{ item }}</li>
        {% endfor %}
        </ul>
        {%endif%}
        
        
        {%if partial_name == 'partial3'%}
        <ul>
        {% for item in list %}
           <li>{{ item }}</li>
        {% endfor %}
        </ul>
        {%endif%}
        

        模板/index.html

        {% include 'partials/example-partial.html' with list=list1 partial_name="partial1"%}
        {% include 'partials/example-partial.html' with list=list2 partial_name="partial2"%}
        {% include 'partials/example-partial.html' with list=list3 partial_name="partial3"%}
        

        【讨论】:

          【解决方案4】:

          ...刚开始在 Django 中使用 jinja。 打开它很容易 而且你可以同时使用两个模板引擎,当然对于不同的文件。

          【讨论】:

            【解决方案5】:

            在 Django 模板语言中不支持宏,但您可以选择 Jinja 引擎以使用宏。请记住,如果您正在构建一个可插入的应用程序,Django 建议使用 DTL。

            一个 Django 项目可以配置一个或多个模板 引擎(如果您不使用模板,甚至为零)。姜戈船 它自己的模板系统的内置后端,创造性地称为 Django 模板语言 (DTL),以及流行的替代方案 Jinja2.

            Django 模板语言是 Django 自己的模板系统。直到 Django 1.8 它是唯一可用的内置选项。这是一个很好的 模板库,即使它相当自以为是并且运动了一些 特质。如果您没有迫切的理由选择另一个 后端,你应该使用 DTL,特别是如果你正在编写一个 可插拔应用程序,并且您打算分发模板。姜戈的 包含模板的 contrib 应用程序,例如 django.contrib.admin,使用 DTL。

            这里是配置其他模板引擎的文档链接:https://docs.djangoproject.com/en/dev/topics/templates/#configuration

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-21
              相关资源
              最近更新 更多