【问题标题】:Nest {% block %} in {% for %} Django template inheritance在 {% for %} Django 模板继承中嵌套 {% block %}
【发布时间】:2020-12-25 17:06:30
【问题描述】:

我正在使用 Django 开发一个字典应用程序。该应用的主要主题之一是显示定义提要。

具体来说,我有:

  1. 列出新定义的“索引”提要,
  2. “词条”供稿,其中列出了特定词条的定义,
  3. 和一个“标签”提要,其中列出了带有特定标签的定义。

index.html

{% block body %}
    <h1>Definitions</h1>
    <ul>
        {% for definition in definitions %}
            // definition HTML
        {% endfor %}
    </ul>
{% endblock %}

headword.html

{% block body %}
    <h1>{{ headword }}</h1>
    <ul>
        {% for definition in headword.definitions_headword.all %}
            // definition HTML
        {% endfor %}
    </ul>

tag.html

{% block body %}
    <h1>{{ tag }}</h1>
    <ul>
        {% for definition in tag.definitions_tag.all %}
            // definition HTML
        {% endfor %}
    </ul>

显然,我需要这三个文件可以共享的基本 feed.html 模板。对于h1 标签没问题。但是,我遇到了 for 循环可迭代变量的问题。

我尝试将 {% block iterable %}{% endblock %} 嵌套在 feed.html 的 for 循环中,就像在 {% for definition in {% block iterable %}{% endblock %} %} 中一样,然后在 @987654327 中插入定义、headword.definitions_headword.all 和 tag.definitions_tag.all @,但 Django 似乎不支持。

我可能会向所有三个模板传递一个“定义”上下文变量,并将其用作所有三个 for 循环中的可迭代对象,但是有没有办法在不接触 Python 代码的情况下做到这一点?

【问题讨论】:

    标签: python django django-templates feed template-inheritance


    【解决方案1】:

    最后你的解释对我来说有点模糊,但只是基于你的第一句话“显然,我需要一个这三个文件可以共享的基本 feed.html 模板。”

    我认为 {% include %} 可能是您正在寻找的。​​p>

    https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#include

    1. 创建包含通用变量的“feed.html”基本模板。下面的通用变量是“header_name”和“definitions”。
    <h1>{{ header_name }}</h1>
    <ul>
        {% for definition in definitions %}
            // definition HTML
        {% endfor %}
    </ul>
    
    1. 在您的父模板(索引、词条、标签)中,使用“include”标签。将您的父模板变量传递到子模板中。以下示例:

    headword.html

    {% block body %}
        {% include 'pathname/feed.html' with header_name=headword definitions=headword.definitions_headword.all %}
    {% endblock %}
    

    tag.html

    {% block body %}
        {% include 'pathname/feed.html' with header_name=tag definitions=tag.definitions_tag.all %}
    {% endblock %}
    

    【讨论】:

    • 谢谢你,伙计。这可能就是我一直在寻找的。但是,现在我有一个双导航栏。 feed.html 扩展 base.html(导航栏所在的位置)是一个问题吗?如果是这种情况,如何避免代码重复?
    • 正确扩展。当您包含子模板时,该子模板不需要继承/扩展基础。您几乎可以将“包含”视为反向“扩展”。
    • 谢谢,但是我该如何避免重复我的 base.html 代码呢?现在我的 feed.html 扩展了 base.html,然后,正如您所指出的,index、headword 和 tag.html 包括 feed.html。这会产生一个双导航栏。我将如何改变这一点,以便我不必重复代码?
    猜你喜欢
    • 2017-05-15
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多