在 {% for %} Django 模板继承中嵌套 {% block %}
Nest {% block %} in {% for %} Django template inheritance
我正在使用 Django 开发字典应用程序。该应用程序的主要主题之一是显示定义提要。
具体来说,我有:
- 列出新定义的“索引”提要,
- 一个“词条”供稿,其中列出了特定词条的定义,
- 和一个“标签”供稿,其中列出了用特定标签标记的定义。
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
- 创建包含通用变量的“feed.html”基本模板。下面的通用变量是“header_name”和“定义”。
<h1>{{ header_name }}</h1>
<ul>
{% for definition in definitions %}
// definition HTML
{% endfor %}
</ul>
- 在您的 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 %}
我正在使用 Django 开发字典应用程序。该应用程序的主要主题之一是显示定义提要。
具体来说,我有:
- 列出新定义的“索引”提要,
- 一个“词条”供稿,其中列出了特定词条的定义,
- 和一个“标签”供稿,其中列出了用特定标签标记的定义。
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
- 创建包含通用变量的“feed.html”基本模板。下面的通用变量是“header_name”和“定义”。
<h1>{{ header_name }}</h1>
<ul>
{% for definition in definitions %}
// definition HTML
{% endfor %}
</ul>
- 在您的 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 %}