您好,我有以下3个模板(出于简化本文的目的):
1-base.html:
//link stylesheet
{% block page_content %}
{% endblock %}
//add bootstrap, jQuery and run scripts
2-base_app.html:
{% extends "base.html" %}
{% block page_content %}
//html here
{% endblock page_content %}
{% block page_app %}
{% endblock page_app %}
3-base_app_main.html:
{% extends "base_app.html"%}
{% block page_app %}
//html i wanna display when I call render(request, 'base_app_main.html', context)
{% endblock page_app %}
目前,当我显示3 - base_app_main.html
时,它不会显示{% block page_app %}
块内的零件,但是,如果我按如下所示更改2 - base_app.html
,那么它将起作用:
2-MODIFIED base_app.html:
{% extends "base.html" %}
{% block page_content %}
//html here
{% block page_app %}
{% endblock page_app %}
{% endblock page_content %}
我不明白为什么模板继承在第一种情况下不起作用,而在第二种情况下却起作用?
我可以找到的文档或在线教程没有给出相关的多个继承示例。
答案 0 :(得分:1)
我认为它在http://localhost:3000中描述了有关模板继承的明确内容
如果您在模板中使用{%extended%},则它必须是第一个模板 在该模板中标记。模板继承将无法正常工作。
您第一次尝试的操作基本上是在1个模板中的{%extended%}内,{{extended%}}的结果是,主模板即base.html具有2个extension标签。那等于Template inheritance won’t work
答案 1 :(得分:0)
父模板仅从匹配的{% block %}{% endblock %}
中的子对象中获取内容。您的base.html仅具有page_content块,因此不包括子级中的其他块。您可以将base.html修改如下:
//link stylesheet
{% block page_content %}
{% endblock %}
{% block page_app %}
{% endblock page_app %}
//add bootstrap, jQuery and run scripts
答案 2 :(得分:0)
因此,对于任何陷入同一点的人,在线教程中的解释对我来说都很清楚:
在第1行中,{%extended“ base.html”%}告诉Django模板引擎当前模板是一个子模板,并且继承自base.html。这必须是子模板中的第一行,否则将无法使用。模板引擎遇到此行时,它将立即加载父模板(即base.html),然后用子模板中定义的同名内容块替换父模板中的内容块。
基本上,在那些继承方案中实际呈现的模板是祖先或此处base.html
。如果您仔细阅读以下内容:
,然后将父模板中的内容块替换为 子模板中定义的同名内容块
您会看到,在第一种情况下,当我渲染base.html
时,我将渲染其子项{% block page_content %}
的{{1}}中的内容。因此,我得到的网页将不包含与base_app.html
块有关的任何内容。
解决此问题的方法是使信息从{% block page_app %}
中的{% block page_app %}
冒泡到我们的base_app_main.html
。
为此,我找到了两种解决方案:
1-嵌套或将base.html
修改为:
base_app.html
在这种情况下,当渲染{% extends "base.html" %}
{% block page_content %}
//html here
{% block page_app %}
{% endblock page_app %}
{% endblock page_content %}
时,它将从base.html
块(现在包括{% block page_content %}
块)中获取所有信息,并成功渲染所有内容。
2-如此修改{% block page_app %}
:
base.html
这将明确要求//link stylesheet
{% block page_content %}
{% endblock page_content %}
{% block page_app %}
{% endblock page_app %}
//add bootstrap, jQuery and run scripts
渲染其子项的base.html
块,并且也可以正常工作。
->首选哪种方法?我不确定。显式方法(2)似乎更简单,但这也意味着,如果将{% block page_app %}
用于许多不同的项目,则将有很多障碍。相对于DRY而言,隐式(1)方法更好...也许有些人可以让我知道哪个是“标准”。