从扩展模板覆盖`include`d模板中的块

Tim*_*ony 13 django django-templates

我有以下内容:

base.html文件

<html>
    {% include 'header.html' %}
    <div>
    {% block content %}Default Content{% endblock %}
    </div>
</html>
Run Code Online (Sandbox Code Playgroud)

了header.html

<header>
     {% block logo %}Logo 1{% endblock %}
</header>
Run Code Online (Sandbox Code Playgroud)

homepage.html

{% extend 'base.html' %}
{% block logo %}Logo 2{% endblock %}
{% block content %}Yap Yap Yap{% endblock %}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,这不起作用.当我渲染homepage.html我得到:

<html>
    <header>Logo 1</header>
    <div>Yap Yap Yap</div>
</html>
Run Code Online (Sandbox Code Playgroud)

但如果我将代码header.html移入base.html(即include完全摆脱)它可以正常工作.任何人都可以解释为什么会这样吗?

我觉得它与included父母被渲染后渲染的模板有什么关系?

Tim*_*ony 10

来自文档

include标记应该被视为"渲染此子模板并包含HTML"的实现,而不是"解析此子模板并将其内容包含在内,就好像它是父类的一部分".这意味着包含的模板之间没有共享状态 - 每个包含都是完全独立的渲染过程.

所以subtemplate(header.html)完全呈现并插入到父模板(base.html)中,这意味着没有用于子模板(homepage.html)覆盖的块的概念


cai*_*aio 5

这是一个已知的限制,我们希望在不久的将来能够解决.

顺便说一句,假设你有一个你提到的更复杂的问题,另一个解决方法是使标题成为一个块,而不是用一个新的自定义包覆盖这个块.

base.html文件

<html>
    {% block header %}
        {% include 'header.html' %}
    {% endblock %}
    <div>
        {% block content %}Default Content{% endblock %}
    </div>
</html>
Run Code Online (Sandbox Code Playgroud)

了header.html

<header>
     {% block logo %}Logo 1{% endblock %}
</header>
Run Code Online (Sandbox Code Playgroud)

homepage.html

{% extends 'base.html' %}

{% block header %}
    {% include 'homepage_header.html' %}
{% endblock %}

{% block content %}Yap Yap Yap{% endblock %}
Run Code Online (Sandbox Code Playgroud)

homepage_header.html

{% extends 'header.html' %}

{% block logo %}Logo 2{% endblock %}
Run Code Online (Sandbox Code Playgroud)