Django的模板系统


目录

  • 模板系统介绍
  • django的模板语言组成
  • 模板语言之变量
    • 变量之深度查询(英文句点符.)
    • 变量过滤器(filter)的使用
  • 标签(tag)的使用
  • 自定义filter和simple_tag
    • 如何调用自定义filter和simple_tag
  • 模板引入和继承
    • 模板引入
    • 模板继承
    • 使用继承的注意事项:
    • 模板继承的一些诀窍:

正文

回到顶部回到顶部回到顶部回到顶部回到顶部回到顶部

模板引入和继承

模板引入

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

引入方法

1 2 3 4 5 6 {% load staticfiles %}   HTML相关内容     {% include '要引入的html文件名' %}

模板继承

常见的 Web 开发问题: 在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码?

解决该问题的传统做法是使用 服务器端的 includes ,你可以在 HTML 页面中使用该指令将一个网页嵌入到另一个中。 事实上, Django 通过刚才讲述的 {% include %} 支持了这种方法。 但是用 Django 解决此类问题的首选方法是使用更加优雅的策略—— 模板继承 。

本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。

如果子板不自定义块,默认会继承母板的所有内容(包括模板的css,js),如果子板要修改css或js文件,在相应地方加块,就可以了

例如:

简单写一个子板继承母板

定义母板文件base.html,定义子板要自定义的块

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 "en">     "UTF-8">     Title  

HAHA

  {% block  content %}     

子板自定义修改的内容

  {% endblock %}

定义子板文件child.html

1 {% extends "base.html" %}

子板如果就这么一行代码,就会继承母板的所有内容,这{% extends "母板文件" %}必须写在最首行

如果要自定义修改块

1 2 3 4 {% extends "base.html" %} {% block content %}     

"color: red">我是子板,修改了母板自定义块的内容

{% endblock %}

注:

母板

{% block 自定义块名%}   

子板的块

{% block 母板中相应设置的块名 }

{% block %}  内容 {% endblock %}的标签也是成对出现

使用继承的注意事项:

  1. 创建 base.html 模板,在其中定义站点的主要外观感受。 这些都是不常修改甚至从不修改的部分。
  2. 为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板对base.html 进行拓展,并包含区域特定的风格与设计。
  3. 为每种类型的页面创建独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。

模板继承的一些诀窍:

    1. 如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。
    2. 一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越多越好。
    3. 如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。
    4. 不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。