在Django模板中,“{% extends %}”与“{% include %}”的区别

47

什么时候特别使用扩展模板,什么时候使用include?像用户个人资料部分(例如我们网站角落的关于我)这样的内容是否有用include?

7个回答

79

扩展允许您从父模板替换块(例如“内容”),而不是包含构建页面的部分(例如“页眉”和“页脚”)。 这样,您就可以拥有一个包含完整布局的单个模板,并且只需通过替换块来“插入”其他模板的内容。

如果用户配置文件在所有页面上都被使用,那么您可能希望将其放在基础模板中,该模板由其他模板继承,或者将其包含在基础模板中。 如果您只想在很少的页面上使用用户配置文件,则也可以将其包含在这些模板中。 如果用户配置文件除了某些页面外都是相同的,请将其放在基础模板内的块中,然后在需要不同配置文件的模板中替换它。


6
有史以来关于extends/block/include的最佳总结 - Philip007

12

了解有关Django的模板继承

“extends”可以类比为“包含”,它会引用父模板,之后可以重写其中的一部分以实现不同的功能。

而“include”则是在当前上下文中简单地渲染一个模板。


4
链接上似乎没有提供示例或解释继承,因此情况已有所改变。 - Harlin
1
我认为这可能是新的链接 - Sachin Tripathi

5

extends会创建“父子关系”。如果使用extends,存在覆盖父类功能的风险。而include只是渲染HTML响应。


1
使用 % include ... with (请参阅文档) 可以覆盖包含页面中的变量。因此,不能同意 muhammad-awais-bin-majid 的答案。
假设这两个子句只代表了构建页面的不同方式:
  1. extends - 用作页面的外部包装器,
  2. include - 将包含的页面插入当前页面。
此外,可以使用多个扩展页面进行链接嵌套,但是包括允许我们逐个使用多个包含的页面,而不仅仅是在链接嵌套中。

0

包括:将一个页面的HTML代码复制(可能是样板)到另一个页面。

  • 例如,假设您有一个导航栏,在每个页面上都会显示,但您不想一遍又一遍地重新输入该代码。如果您只需编写一次导航栏代码,然后将其包括在需要导航栏的每个页面中,那岂不是很好?包括可以实现这一点。
  • 创建一个名为nav.html的小文件,其中只包含导航栏代码,然后将该nav.html文件包括在需要导航栏的每个页面中,示例如下:{% include 'nav.html' %}

扩展:在通用模板内包装一个页面的实质内容。

例如,假设您在每个页面上布局了一些通用内容:页眉、页脚等等...我们将其称为genericPage.html。然后,您可以创建一堆只包含实质内容的小型html片段:home.html、about.html、contact.html等等。
您希望将每个实质页面的内容放入通用包装器中。为此,您可以通过在每个页面顶部放置以下代码{% extends 'genericPage.html' %}来扩展这些内容页面,将它们包装在主模板中。

0

{% extends %}:

  • 可以扩展一个模板,然后子模板可以覆盖在父模板中定义的{% block %}。

  • 必须是模板中的第一个标签,这意味着在一个模板中只允许使用一个{% extends %}

因此,您应该将常规布局组件(如{% block title %}{% block header %}{% block navigation-bar %}{% block main %}{% block footer %})放到基础模板(如base.html)中,然后在主模板(如index.html)中使用{% extend %}扩展base.html


{% include %}:

  • 可以将多个模板注入(放置)到一个模板中,同一个模板也可以被注入到一个模板中多次。

因此,基本上应该将在几个页面上使用的不规则布局组件放置在主模板中,例如index.html,除了基础模板如base.html之外。


*最后,我认为这些Django管理模板是使用{% extends %}{% include %}{% block %}的良好示例。


0

{% extends 'base.html' %} 用于创建子模板以维护结构和内容继承。{% include 'base.html' %} 用于在一个模板中插入另一个模板的内容而不改变结构。

include 不会改变模板(布局)的整体结构,而 extend 则会改变布局的整体结构。

根据您的需求,您可以选择更适合您工作的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接