Django 从扩展模板覆盖“include”d模板中的块
我有以下资料: base.htmlDjango 从扩展模板覆盖“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
<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
。这没有道理。