Django 模板语言 extend和include的使用

在Django网页开发中,一个网站的不同页面都存在大量相同的布局,如果在每一个页面都写上相同的代码,那个维护的工作量就太大了。为了减少不必要的重复工作,Django允许开发者定义基本的模板,然后其他的页面继承这个模板的布局。


例如:首先我创建一个模板文件 layout.html

wKioL1mJEPjidWQ6AAA7dL9w9iM208.jpg


layout.html,注意在这个模板里面,我使用了一个新的模板语言{% block name%}, name可以自己取,这样凡是继承这个模板的页面,在新的页面里面,只需要把自己的内容放在同名的{%block name%}里面,这部分内容就自动替换到模板里面了,模板的其他部分会全部继承。


值得一提的是{% block css %}和{% block js %}这两个block的位置,这是为了新的页面可以放入自己的css定义和javascript文件,而不是全盘的继承。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html>
< html  lang = "en" >
< head >
     < meta  charset = "UTF-8" >
     < title >{% block title %} {% endblock %}</ title >
     < link  rel = "stylesheet"  href = "/static/commons.css"  />
     < style >
         body{
             margin: 0;
         }
         .menu{
             display: block;
             padding: 5px;
         }
     </ style >
     {% block css %}{% endblock %}
</ head >
< body >
     < div  style = "height: 48px;background-color: black;color: white" >
         运维管理系统
     </ div >
     < div >
         < div  style = "position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;" >
             < a  class = "menu"  href = "/cmdb/user_info/" >用户管理</ a >
             < a  class = "menu"  href = "/cmdb/user_group/" >用户组管理</ a >
         </ div >
         < div  style = "position:absolute;top:48px;left: 210px;bottom: 0;right: 0;overflow: auto" >
             {% block content %}
             {% endblock %}
         </ div >
     </ div >
< script ></ script >
{% block js %}{% endblock %}
</ body >
</ html >


下面是一个标准的Django生命周期


urls.py 里面定义url,指向一个函数


1
2
3
urlpatterns  =  [
     url(r '^tpl1/' , views.tpl1),
]



views.py调用的函数,返回一个列表给tp1.html

1
2
3
def  tpl1(request):
     user_list  =  [ 1 2 3 43 ]
     return  render(request,  'tpl1.html' , { 'u' : user_list})


tpl1.html 需要继承前面创建的模板, 通过{% extends 'layout.html' %}指定继承哪一个模板,通过不同的block的名字可以定义自己的内容,这些内容会自动替换掉layout.html所对应的block,顺序并没关系。可以看见,我的tp1l.html写的很简单,全部都是对应模块和实际内容的替换,这里没有任何关于页面布局的设定,这些都可以从layout.html那里继承的。


注意这里还自定义了这个页面本身特有的css和Javascript,为了使用它们,前面layout里面专门定义了css和js的block。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{%  extends 'layout.html' %}
{% block title %}用户管理{% endblock %}
{% block content %}
     < h1 >用户管理</ h1 >
     < ul >
         {% for i in u %}
             < li >{{ i }}</ li >
         {% endfor %}
     </ ul >
{##}
{#    {% for i in u %}#}
{#        {% include 'tag.html' %}#}
{#    {% endfor %}#}
{% endblock %}
{% block css %}
     < style >
         body{
             background-color: whitesmoke;
         }
     </ style >
{% endblock %}
{% block js %}
     < script >
         console.log('hhh')
     </ script >
{% endblock %}


效果:成功的继承了layout的内容,自己定义的内容,css和Javascript也应用了

wKiom1mJFACxROvIAACCEbsfrkA077.jpg


在上面的基础上,我们还可以更进一步,比如在一个block里面,我们可能需要使用很多重复的布局,这个时候,可以使用include,把这些类似的重复的布局写在另外一个模板文件中,这里直接调用这个文件的内容,整个内容会放在当前的目标里面,然后再一股脑的放在父模板里面去渲染。因此这个include需要放在整个block里面。


例如,修改上面的代码

首先创建一个新的模板文件,li.html

1
< li >{{ item }}</ li >


然后修改tpl1.html里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{#{% extends 'master.html' %}#}
{%  extends 'layout.html' %}
{% block title %}用户管理{% endblock %}
{% block content %}
     < h1 >用户管理</ h1 >
     < ul >
         {% for item in u %}
             {% include 'li.html' %}
         {% endfor %}
     </ ul >
 
{% endblock %}
{% block css %}
     < style >
         body{
             background-color: whitesmoke;
         }
     </ style >
{% endblock %}
{% block js %}
     < script >
         console.log('hhh')
     </ script >
{% endblock %}


最后的效果是一样的


wKiom1mJFACxROvIAACCEbsfrkA077.jpg






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1954342,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值