论坛首页 编程语言技术论坛

Django中的模板继承与现实中的房子

浏览 2291 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-30   最后修改:2009-12-30

版权所有 SinFrancis http://mdev.cc
 
最近房价疯涨,连二、三线城市的房子也如果脱缰野马一般,让工薪阶层实在是无奈。。。
不过Django中的模板还真有先见之明,使用继承制度,父辈的房子子女可以继承,不怕城管暴力拆迁。。。
 
编个故事:
 
    老D生长在党旗下,贯彻了计划生育,有一个儿子叫小D。儿子渐渐长大,从小学到中学再到高中,也花费了老D不少的心血和金钱,儿子考上了北京XX大学,儿子去北京前,老D对小D说:儿啊,去北京好好读书,以后有机会就留在北京发展,不行就回来,我在老宅基地上给你建个小楼,以后啊你想回来发展就住那。于是老D还真在老宅基地上建了二层小楼,这个小楼在小D家乡不算大也不算小,光一楼就150㎡,里面没有装修,简单的家具而已。
   4年之后,大学念完了,小D在外面奔波找工作,住在城中村,结果城市发展,城中村拆迁,小D不得不再次找房子,拿着那可怜的工资。
 
   有这样过了2年,小D准备回家发展,于是回到家乡,用自己工作剩下的钱把房子装修了一下,每天在家接单办公。。。
   是否悠哉?只有自己心里明白。。
 
 
老D建的房子就是父模板:base.html
小D回来装修就是继承了这个模板,往其中存放自己想要的东西:child.html
等到小D老了,房子给了小小D,那么小小D有可能再次将房子装修或者更换其中家具,但房子的主体没变。
 
在实际代码中应该是这样的
老D在房子中预留了可以装修的空间 ,比如
 

{%block middle%}
            
{%endblock%}

 
 
然后小D在其中进行装修:
 
小D的装修:
 

{%block middle%}
這個是中間的數據--{{name}}
{%endblock%}

 
 
小小D的装修:

{%block middle%}
    <div style="background:green">
    {{block.super}}
    <Br/>
    <h3>這個是Child2自己的內容</h3>
    </div>
{%endblock%}

  
如果小D或者小小D想留下父亲在房子中间留下的东西,需要调用 {{block.super}}即可
 
 
Base.html的代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>{%block title%}{%endblock%}</title>
    </head>
    <body>
        <!--包含頭文件-->
        {%block header%}
        {%include 'header.html'%}
        {%endblock%}
        
        <!--中間數據塊-->
        {%block middle%}
            
        {%endblock%}
        <!--這個是父模版中的內容-->
        {%block myContent%}
            這個就是父模板的內容,如果你想調用這個內容,請使用block.super
        {%endblock%}
        
        <!--包含底部文件-->
        {%block footer%}
        {%include 'footer.html'%}
        {%endblock%}
        
        
{%block test%}
{%endblock%}
    </body>
</html>

  
 
 child.html的代码:
 

{%extends "base.html"%}
{%block title%}
    這個就是標題
{%endblock%}

{%block middle%}
這個是中間的數據--{{name}}
{%endblock%}

{%block myContent%}
{{block.super}}
{%endblock%}

 
 
child2.html的内容:
 

{%extends "child.html"%}

{%block title%}
    {{block.super}}-這個是新加的標題
{%endblock%}

{%block middle%}
    <div style="background:green">
    {{block.super}}
    <Br/>
    <h3>這個是Child2自己的內容</h3>
    </div>
{%endblock%}

{%block myContent%}
    <div style="background:#336699">
{{block.super}}
</div>
{%endblock%}

  
 
 
 
 
 数据代码:

def extend(request):
    name = "LOLI"
    return render_to_response("child.html",locals());

def extend2(request):
    name = "LOLI2"
    return render_to_response("child2.html",locals());

  
 
应该注意的地方:
 
1、继承并不改变 context 的工作方式,而且你可以按照需要使用多层继承。使用继承的一种常见方式是下面的三层法:

 
2、创建 base.html 模板,在其中定义站点的主要外观感受。这些都是不常修改甚至从不修改的部分。


 3、为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板  对 base.html 进行拓展,并包含区域特定的风格与设计。


 4、为每种类型的页面创建独立的模板,例如论坛页面或者图片库。这些模板拓展相应的区域模板。

 


这个方法可最大限度地重用代码,并使得向公共区域(如区域级的导航)添加内容成为一件轻松的工作。

 


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


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


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

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


 

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


 

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


 

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


 

7、多数情况下, {% extends %} 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也可以是个变量。这使得你能够实现一些很酷的动态功能。
 
 
   可惜zh-CN的土地或者是房子不是继承制,而是在时间段内有效,大家都是游民而已。
   故事编的不好,只是为了让大家更好的理解这个道理,看了文章,请轻拍砖。
 
 
 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics