`

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

阅读更多

版权所有 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的土地或者是房子不是继承制,而是在时间段内有效,大家都是游民而已。
   故事编的不好,只是为了让大家更好的理解这个道理,看了文章,请轻拍砖。
 
 
 

分享到:
评论

相关推荐

    Django_layui后台模板

    在Django中,Model用于处理数据模型,View负责业务逻辑和视图呈现,Template则是用于展示数据的模板系统。Django提供了一系列内置功能,如ORM(对象关系映射)、表单处理、认证与授权、URL路由、中间件等,极大地...

    python-django模板

    4. **继承与块**:Django模板支持模板继承,这使得我们可以创建一个基础模板(如`base.html`),其他模板可以继承并覆盖或添加内容。通过`{% extends %}`指令继承模板,然后用`{% block %}`定义可重写区域。 5. **...

    django博客项目前端模板.rar

    【标题】:“django博客项目前端模板.rar”是一个与Python的Django框架相关的压缩包,它包含了一套完整的Django博客项目的前端模板。这个模板设计旨在为开发者提供一个基础的、可自定义的用户界面,用于展示博客内容...

    Django登录模板页面login.html

    django4中文文档

    Django自带一个面向对象的、反映数据模型与关系型数据库间的映射关系的映射器,开发者无须学习SQL语言即可操作数据库 灵活的URL映射。Django提供一个基于正则表达式的URL分发器,开发者可灵活地编写URL Django内置了...

    django4.0官方中文文档

    模板语言支持继承、过滤器、标签等功能,使得界面设计更加灵活。 5. **URL路由(URL Conventions)**:URL配置是Django中至关重要的部分,它将URL模式映射到相应的视图函数。Django 4.0的URL配置更加强大和灵活,...

    django,模板中变量赋值.docx

    【django 模板中变量赋值】 在 Django 模板系统中,变量的赋值是通过模板语言来实现的。Django 模板语言是一种轻量级的语法,用于渲染动态内容。它允许开发者在 HTML 或其他静态文件中插入动态数据,如数据库查询...

    6. Django 深入模板

    - **变量**:在Django模板中,用双大括号`{{ }}`包裹的变量会被其对应的数据对象替换。例如,`{{ user.username }}`会显示用户对象的username属性。 - **标签**:标签是执行特定操作的代码片段,比如`{% if %}`和`...

    django,模板中变量赋值.pdf

    【django 模板中变量赋值】 在 Django 模板系统中,变量赋值是通过模板语言实现的,主要用于展示动态生成的数据。Django 模板语言提供了多种方式来操作和展示模型、视图传递给模板的数据。以下是关于在 Django 模板...

    一套精美的博客模板

    描述中提到了“如果要是用Django开发”,这表明该模板是针对Django这一Python web框架设计的。Django是一个高级的、全面的Web框架,它允许开发者快速开发安全和可维护的网站。Django强调DRY(Don't Repeat Yourself...

    django中文开发手册

    - **模板继承**:介绍如何使用模板继承机制来复用公共的部分,提高代码的可维护性。 - **模板标签**:讲解如何自定义模板标签,扩展Django模板系统的功能。 #### 五、数据库交互:数据建模(第五章) - **ORM基础*...

    django实现的blog

    通过这个项目,开发者可以学习到如何在Django中组织代码、处理用户输入、与数据库交互、创建动态网页以及优化静态资源的交付。此外,Django 1.7虽然较旧,但其核心概念在现代Django版本中仍然适用,因此学习这个项目...

    django-3.2中文文档.zip

    - 虽然文件名中包含“js”,但 Django 的模板语言是用于生成 HTML 的,与 JavaScript 不同。这部分文档可能涵盖了 Django 模板语言的基本语法、内置标签和过滤器,以及如何在模板中操作数据。 6. **模块索引(py-...

    Django 中文文档

    13. Django中的安全问题:详细介绍了Django中的安全特性,包括防止常见的网络攻击手段,如点击劫持、跨站请求伪造(CSRF)等。 14. 异常处理:文档提供了一些常用的异常处理方法和策略。 15. 应用程序概览:解释了...

    django3.2模板

    - Django 的模板继承机制允许创建一个基础模板,然后子模板可以继承并扩展这个基础模板,减少了重复代码。 - 基础模板通常包含通用布局,`{% extends 'base.html' %}` 标签用于指定父模板。 - 子模板可以通过 `{%...

    Django:Django模板系统与HTML渲染.docx

    Django:Django模板系统与HTML渲染.docx

    django笔记 django笔记

    Django支持模板继承,使得代码复用和维护更加便捷。 6. **URL路由(URL Routing)**: Django的URL路由系统允许我们定义URL模式,并将其与视图函数关联。这使得URL结构清晰,代码可读性高。 7. **表单(Forms)**...

    django中文教程 word版

    在这一章中,您将了解到 Django 的基本理念,包括它的 MVC(模型-视图-控制器)变体MTV(模型-模板-视图)架构。Django 提供了内置的 ORM(对象关系映射)系统,用于数据库操作,以及强大的 URL 路由系统,使开发者...

Global site tag (gtag.js) - Google Analytics