Django 模板继承

Django 模板继承,前面讲解了Django模板的基本结构与语法,本章进一步讲解模板的另一个重要使用方法——模板继承。

Django的模板就像编程语言中的类一样是可以继承的,通过合理地使用模板继承可以减少开发工作量,提高代码可复用性,进而提升工作效率。如果我们仔细观察一下就会发现,绝大多数网站不论网站规模有多大,一个网站的不同页面之间都会有相同的部分,以W3School为例,可以看到,该网站的头部、主菜单、底部网站信息在任何页面都是一样的,甚至可以认为左侧菜单、右侧广告栏以及中间主窗体都是一样的,只是填充的内容不同而已,如图所示。
Django 模板继承

面对这样的网站如果开发员对每一个页面都单独开发,那么工作量会非常大,而一旦需要进行页面重构的话就会非常困难,需要修改所有页面。面对此类问题的通用做法就是将页面的通用部分提出来,进行单独开发,然后不同的页面同时继承这些公共部分,这样会在很大程度上减少维护成本。

Django通过把网页中每一个通用部分定义在block中的方式实现了代码分离,下面是Blog应用程序所使用的base.html模板:
Django 模板继承

它是网站的骨架,在这个模板骨架中没有定义任何代码实现,只定义了页面结构,该页面包括一个菜单栏以及页面主体。

下面是detail.html模板,用于显示博客的详细信息,通过使用{% extends "base.html" %}继承了base.html。这个子模板实现了所有base.html中的content,当用户访问子模板页面时,模板引擎将使用子模板中的block值重写base.html:
Django 模板继承

注意
extends标签必须位于文件的第一行,即使它前面是注释也不行。
最终生成的HTML文件如图所示。
Django 模板继承

在这里细心的读者可能会发现,子模板中并没有定义{% block sidebar %}...{% endblock %},但是在最后生成的HTML文件里面却包含了这一部分内容,这就是模板继承的优势,我们可以在一个公共的地方专注地开发公共内容,具体实现部分专注自己的业务实现。
注意,Django中的模板虽然可以无限继承,但是一般建议3层即可:

  • Base.html层,这里定义网站的整体骨架。
  • 具体模块.html,这里定义具体的模块,例如页眉、页脚等独立内容。
  • 具体网页.html,这里是真正实现具体网页的模板,会重写具体模块并集成base.html。

Django官网给出了一些最佳实践,在开发自己网站的时候可以参考:

  • 在base.html中尽可能多地使用block。
  • 如果发现在多个模板中都重复写了一些代码,那么可以考虑将这些代码放在上级模板的block中。

如果想在子模板中引用父模板中的block,可以使用{{ block.super }}标签。例如在上面例子中,在菜单中添加更多的菜单,可以按照下面代码实现:
Django 模板继承

浏览器访问,如图所示。
Django 模板继承

需要注意的是,在一个模板文件中block的名字是唯一的不能重复。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!