Django - 调用模板会覆盖包含模板中的块标记

时间:2010-09-26 03:13:51

标签: django include block extends overrides

我有一个包含另一个模板的模板。这个包含的模板中有块标签。

示例:

base.html文件

BASE
{% block title %}Base Title{% endblock %}
{% block content %}{% endblock %}

template1.html

{% extends 'base.html' %}
{% block title %}Extended Title{% endblock %}
{% block content %}
   Extended content
   {% include 'include.html' %}
{% endblock %}

include.html

{% block title %}Include Title{% endblock %}
{% block another_content %}Include Content{% endblock %}

我期待的是,如果我渲染template.html我应该得到,我在1.1.1

下做
BASE
Extended Title
Extended content
Include Title
Include Content

但是当我切换到1.2.1和1.2.3时,我实际上得到了这个:

BASE
Extended Title
Extended Content
Extended Title
Include Content

如您所见,include.html中的标题栏被替换为template1.html的标题栏。仅当块名称相同时才会发生此替换,因此如果我更改include.html中的标题块,则不会发生这种情况。在我看来,它同时包括和延伸?任何人都知道这是否是预料/我做错了什么?

2 个答案:

答案 0 :(得分:3)

如果您在extends未使用 include.html,则此行为是正常的 - 我认为1.1.1中存在错误。

摘自官方文件:

  

最后,请注意,您无法在同一模板中定义多个具有相同名称的{%block%}标记。存在这种限制是因为块标签在“两个”方向上工作。也就是说,块标记不仅提供填充孔 - 它还定义填充父级孔的内容。如果模板中有两个同名的{%block%}标记,则该模板的父级将不知道要使用哪个块的内容。

在这里阅读整篇文章:Template Inheritance

答案 1 :(得分:-1)

如果那是你想要的,那么include.html根本不应该包含任何块,即:

Include Title
Include Content