Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 从扩展模板覆盖“include”d模板中的块_Django_Django Templates - Fatal编程技术网

Django 从扩展模板覆盖“include”d模板中的块

Django 从扩展模板覆盖“include”d模板中的块,django,django-templates,Django,Django Templates,我有以下资料: base.html <html> {% include 'header.html' %} <div> {% block content %}Default Content{% endblock %} </div> </html> <header> {% block logo %}Logo 1{% endblock %} </header> {% extend 'b

我有以下资料:

base.html

<html>
    {% include 'header.html' %}
    <div>
    {% block content %}Default Content{% endblock %}
    </div>
</html>
<header>
     {% block logo %}Logo 1{% endblock %}
</header>
{% extend 'base.html' %}
{% block logo %}Logo 2{% endblock %}
{% block content %}Yap Yap Yap{% endblock %}
<html>
    {% block header %}
        {% include 'header.html' %}
    {% endblock %}
    <div>
        {% block content %}Default Content{% endblock %}
    </div>
</html>
<header>
     {% block logo %}Logo 1{% endblock %}
</header>
{% extends 'base.html' %}

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

{% block content %}Yap Yap Yap{% endblock %}
{% extends 'header.html' %}

{% block logo %}Logo 2{% endblock %}
基本上,这是行不通的。当我呈现
homepage.html
时,我得到:

<html>
    <header>Logo 1</header>
    <div>Yap Yap Yap</div>
</html>

标志1
呀呀呀
但是,如果我将
header.html
中的代码移动到
base.html
(即,完全去掉
包含
),它就可以工作了。有人能解释为什么会这样吗

我有一种感觉,这与
中包含的
模板在其父级渲染后得到渲染有关?

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


因此,子模板(
header.html
)将完全呈现并插入父模板(
base.html
),这意味着子模板(
homepage.html
)没有块的概念要覆盖

您不能从homepage.html覆盖徽标,因为它未在基本模板中定义


正如您所建议的,解决方案是将header.html代码移动到base.html

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

<html>
    {% include 'header.html' %}
    <div>
    {% block content %}Default Content{% endblock %}
    </div>
</html>
<header>
     {% block logo %}Logo 1{% endblock %}
</header>
{% extend 'base.html' %}
{% block logo %}Logo 2{% endblock %}
{% block content %}Yap Yap Yap{% endblock %}
<html>
    {% block header %}
        {% include 'header.html' %}
    {% endblock %}
    <div>
        {% block content %}Default Content{% endblock %}
    </div>
</html>
<header>
     {% block logo %}Logo 1{% endblock %}
</header>
{% extends 'base.html' %}

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

{% block content %}Yap Yap Yap{% endblock %}
{% extends 'header.html' %}

{% block logo %}Logo 2{% endblock %}
顺便说一下,假设您有一个您提到的更复杂的问题,另一个解决方法是将header设置为块,而不是使用新的自定义include覆盖该块

base.html

<html>
    {% include 'header.html' %}
    <div>
    {% block content %}Default Content{% endblock %}
    </div>
</html>
<header>
     {% block logo %}Logo 1{% endblock %}
</header>
{% extend 'base.html' %}
{% block logo %}Logo 2{% endblock %}
{% block content %}Yap Yap Yap{% endblock %}
<html>
    {% block header %}
        {% include 'header.html' %}
    {% endblock %}
    <div>
        {% block content %}Default Content{% endblock %}
    </div>
</html>
<header>
     {% block logo %}Logo 1{% endblock %}
</header>
{% extends 'base.html' %}

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

{% block content %}Yap Yap Yap{% endblock %}
{% extends 'header.html' %}

{% block logo %}Logo 2{% endblock %}
主页_header.html

<html>
    {% include 'header.html' %}
    <div>
    {% block content %}Default Content{% endblock %}
    </div>
</html>
<header>
     {% block logo %}Logo 1{% endblock %}
</header>
{% extend 'base.html' %}
{% block logo %}Logo 2{% endblock %}
{% block content %}Yap Yap Yap{% endblock %}
<html>
    {% block header %}
        {% include 'header.html' %}
    {% endblock %}
    <div>
        {% block content %}Default Content{% endblock %}
    </div>
</html>
<header>
     {% block logo %}Logo 1{% endblock %}
</header>
{% extends 'base.html' %}

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

{% block content %}Yap Yap Yap{% endblock %}
{% extends 'header.html' %}

{% block logo %}Logo 2{% endblock %}

我也有类似的问题。我有一个过滤表模板,它的形式是

{% extends 'base.html' %}
{% include 'filtered_table.html' %}
其中,filtered_table.html是:

{% load render_table from django_tables2 %}
<div class="panel-body" >
  <form method='GET'>
  <div class="search-form" style="border: 1px solid #000000; background-color:#a3ffaf; overflow: auto;">
{% block render_form %}
    {% for field in filter.form %}
         {{ field.errors }}
         {{ field.label_tag }} {{ field }}
    {% endfor %}
{% endblock %}
    <input type='submit' value='Filter' />
    |
    Displaying {{ filter.qs.count }} of {{ filter.queryset.count }} {{ object_name }}s.
    |
    <a href='{{ request.path }}' >Clear</a> <p>
  </div>

{% if table %}
    {% render_table table %}
{% endif %}

</form>

</div>

这是以牺牲粗俗为代价来解决问题的。只允许多个扩展要容易得多。

这是可行的,但在我看来,这是相当丑陋的。假设您的应用程序中有大约30个不同的页面,每个页面的标题都有一些特殊性(比如一个徽标或标题),这将创建大量的
anypage\u header.html
,以及每个页面已有的常规
anypage.html
。这没有道理。