Django 模板继承extends 与 include标签

本文介绍了Django模板系统的两个核心特性:include标签和extends继承。include用于减少代码重复,可在多个模板间共享相同片段;extends则实现了模板继承,通过定义基础模板与子模板,灵活复用和定制页面布局。

序:对于一个完全不懂后端的人来说,立马学习Django还真是赶鸭子上架,下面我记下了Django模板系统中重要的亮点

一,include标签

      

在讲解了模板加载机制之后,我们再介绍一个利用该机制的内建模板标签: {% include %} 。该标签允许在(模板中)包含其它的模板的内容。 标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。 每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。

下面这两个例子都包含了 nav.html 模板。这两个例子是等价的,它们证明单/双引号都是允许的。

1{% include 'nav.html' %}
2{% include "nav.html" %}

下面的例子包含了 includes/nav.html 模板的内容:

1{% include 'includes/nav.html' %}

下面的例子包含了以变量 template_name 的值为名称的模板内容:

1{% include template_name %}

也就是说,加载的模板名还可以在 view 层中定义。

和在 get_template() 中一样, 对模板的文件名进行判断时会在所调取的模板名称之前加上来自 TEMPLATE_DIRS 的模板目录。

所包含的模板执行时的 context 和包含它们的模板是一样的。 举例说,考虑下面两个模板文件:

01# mypage.html
02
03<html>
04<body>
05{% include "includes/nav.html" %}
06<h1>{{ title }}</h1>
07</body>
08</html>
09
10# includes/nav.html
11
12<div id="nav">
13    You are in: {{ current_section }}
14</div>

如果你用一个包含 current_section的上下文去渲染 mypage.html这个模板文件,这个变量将存在于它所包含(include)的模板里,就像你想象的那样。

如果{% include %}标签指定的模板没找到,Django将会在下面两个处理方法中选择一个:

  • 如果 DEBUG 设置为 True ,你将会在 Django 错误信息页面看到 TemplateDoesNotExist 异常。

  • 如果 DEBUG 设置为 False ,该标签不会引发错误信息,在标签位置不显示任何东西。


二,extends 

include  逆向 extends

 

 一、定义基础模板,在html内容中定义多个block块,block由子模板引用同名block块,来决定是否替换这些部分

{% block title %}一些内容,这里可不填{% endblock %}
{% block content %}一些内容,这里可不填{% endblock %}
{% block footer %}一些内容,这里可不填{% endblock %}

这里 title content footer 不是变量,名字自定义


 

二、子模板的引用方式
{% extends "base.html" %}

{% block title %}The current time{% endblock %}
{% block content %}<p>It is now {{ current_date }}.</p>{% endblock %}

第一句是固定的格式,必须为模板中的第一个模板标记
extends的参数一般为字符串,也可为变量
可带路径,相对路径,以 TEMPLATE_DIRS 的模板目录 为基准
子模板决定替换的block块,无须关注其它部分,没有定义的块即不替换,直接使用父模板的block块 


 

三、引用上级代码块在其基础上进行一些修改 {{ block.super }}

{% block footer %}
{{ block.super }}
AAAAA
{% endblock %}

以下是使用模板继承的一些诀窍:

  •   如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。否则, 模板继承将不起作用。


  •   一般来说,基础模板中的 {% block %} 标签越多越好。记住,子模板不必定义父模板 中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模 板所需的代码块进行(重)定义。俗话说,钩子越多越好。


  •   如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个{% block %} 中。


  •   如果需要获得父模板中代码块的内容,可以使用 {{ block.super }} 变量。如果只想 在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。


  •   不可同一个模板中定义多个同名的 {% block %} 。存在这样的限制是因为 block 标 签的工作方式是双向的。也就是说,block 标签不仅挖了一个要填的坑,也定义了在 父 模板中这个坑所填充的内容。如果模板中出现了两个相同名称的 {% block %} 标签, 父模板将无从得知要使用哪个块的内容。


  •   {% extends %} 对所传入模板名称使用的加载方法和 get_template() 相同。也就是 说,会将模板名称被添加到 TEMPLATE_DIRS 设置之后。


  •   多数情况下, {% extends %} 的参数应该是字符串,但是如果直到运行时方能确定父 模板名,这个参数也可以是个变量。这使得你能够实现一些很酷的动态功能。 



转载于:https://my.oschina.net/mayanli/blog/393726

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值