为什么看起来模板继承仅适用于嵌套块?

时间:2019-11-06 16:05:49

标签: django python-3.x django-templates

您好,我有以下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 %}

我不明白为什么模板继承在第一种情况下不起作用,而在第二种情况下却起作用?

我可以找到的文档或在线教程没有给出相关的多个继承示例。

3 个答案:

答案 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)方法更好...也许有些人可以让我知道哪个是“标准”。