在 {% for %} Django 模板继承中嵌套 {% block %}

Nest {% block %} in {% for %} Django template inheritance

我正在使用 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 循环可迭代变量时遇到问题。

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

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

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

我认为 {% include %} 可能是您要找的。

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

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

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