序:对于一个完全不懂后端的人来说,立马学习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 %} 的参数应该是字符串,但是如果直到运行时方能确定父 模板名,这个参数也可以是个变量。这使得你能够实现一些很酷的动态功能。