首页 > 解决方案 > 使用 {{ block.super }} 跳过一个级别

问题描述

我有一个 3rd 方应用程序,它定义了一堆模板(有点类似于 django-admin 的工作方式)。基本模板定义了一个包含一些内容的块:

base.html:

<!doctype HTML>

<html><head>
<!-- blah blah -->

{% block very_kewl %}
    <marquee><b><i><u>this is very kewl</marquee></b></i></u>
    <!-- disclaimer: this is not valid HTML! -->
{% endblock very_kewl %}

</html>

然后子模板清除块:

actual_page.html:

{% extends 'base.html' %}

{# very many other stuff, part 1 #}

{% block very_kewl %}{% endblock %}

{# very many other stuff, part 2 #}

我想要实现的是在页面上保留“非常kewl”的内容。

一种可行的方法是简单地将整个复制actual_page.html到项目模板目录中并省略该行{% block very_kewl %}{% endblock %}。这可行,但缺点是我还必须重复模板的所有其他部分,其中一些可能在未来发生变化。

所以问题是我怎样才能从基本模板中显示“非常kewl”的内容,而不重复所有其他内容actual_page.html

理想情况下,我可以做这样的事情,但当然,这不起作用:

project_templates/actual_page.html:

{% extends 'actual_page.html' %}

{% block very_kewl %}{{ block.super.super }}{% endblock %}

标签: djangodjango-templates

解决方案


为什么不将基本模板块中使用的 HTML 保留为单独的模板?

project_template/partials/very_kewl.html

<marquee><b><i><u>this is very kewl</marquee></b></i></u>
<!-- disclaimer: this is not valid HTML! -->

现在,只需将它包含在需要使用 HTML 的任何地方。

project_template/base.html

<!doctype HTML>

<html><head>
<!-- blah blah -->

{% block very_kewl %}
    {% include 'partials/very_kewl.html' %}
{% endblock very_kewl %}

</html>

而在孙子project_templates/actual_page.html

{% extends 'actual_page.html' %}

{% block very_kewl %}{% include 'partials/very_kewl.html' %}{% endblock %}

因此,即使在某些时候块被清除,该模板的子模板也可以简单地包含所需的 HTML。


推荐阅读