搞定了一个模板继承

上周harry来了一下,还是觉得他很厉害,同时激起了我要赶紧好好学习的心态。。。

这周来了认真搞了两天,很笨吧。。。终于才搞定了一个继承模板,赶紧写日记记下来。

------------------------------------------------------------------------------------

1,创建项目

django-admin.py startproject mysite

这样就创建了一个mysite的项目。

2,写一个基础模板文件

  我把所有模板文件都放在mysite/templates目录下。另外,如果要使用render_to_response方法(调用模板很方便),还需要先在settings.py下找到TEMPLATE_DIRS这项设置吧。 它的默认设置是一个空元组(tuple),加上一些自动生成的注释。

   该设置告诉 Django 的模板加载机制在哪里查找模板。 选择一个目录用于存放模板并将其添加到TEMPLATE_DIRS 中(同时学会了使用命令pwd,查看当前目录):

 

TEMPLATE_DIRS = (
'/home/yhh/mysite/templates',
)

 

 

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
2  <html lang="en">
3  <head>
4 <title>{% block title %}{% endblock %}</title>
5  </head>
6  <body>
7 <h1>My helpful timestamp site</h1>
8 {% block content %}{% endblock %}
9 {% block footer %}
10 <hr>
11 <p>Thanks for visiting my site.</p>
12 {% endblock %}
13  </body>
14  </html>

 

有了这个文件就可以减少很多冗余的代码,并且文件title啦,模块啦都可以自己扩展。

3,写一个继承上面模板的页面,只是自己独特的得分代码不同,所有其他一样的地方代码已经不用手写,减少了很多代码量。。可能因为操作都是使用命令就觉得一直在敲代码,其实代码也不多~

 

class="cnblogs_code">
1 {% extends "base.html" %}
2
3 {% block title %}Future time{% endblock %}
4
5 {% block content %}
6  <p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p>
7 {% endblock %}

 

4,就可以写试图调用了

 

1 from django.shortcuts import render_to_response
2 import datetime
3
4 def hours_ahead(request,offset):
5 offset = int(offset)
6 dt datetime.datetime.now() + datetime.timedelta(hours=offset)
7 return render_to_response('hours_ahead.html',{'hour_offset':offset,'next_time':dt})

然后python manage.py runserver 0.0.0.0:80

浏览器查看~~耶

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   

你可以根据需要使用任意多的继承次数。 使用继承的一种常见方式是下面的三层法:
创建 base.html 模板,在其中定义站点的主要外观感受。 这些都是不常修改甚至从不修改的部分。
为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板对 base.html 进行拓展,并包含区域特定的风格与设计。
为每种类型的页面创建独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。
这个方法可最大限度地重用代码,并使得向公共区域(如区域级的导航)添加内容成为一件轻松的工作。
以下是使用模板继承的一些诀窍:
如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。
一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越多越好。
如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。
如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。
不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。 也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。
{% extends %} 对所传入模板名称使用的加载方法和 get_template() 相同。 也就是说,会将模板名称被添加到 TEMPLATE_DIRS 设置之后。
多数情况下, {% extends %} 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也可以是个变量。 这使得你能够实现一些很酷的动态功能。

你可以根据需要使用任意多的继承次数。 使用继承的一种常见方式是下面的三层法:
创建 base.html 模板,在其中定义站点的主要外观感受。 这些都是不常修改甚至从不修改的部分。
为网站的每个区域创建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。这些模板对 base.html 进行拓展,并包含区域特定的风格与设计。
为每种类型的页面创建独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。
这个方法可最大限度地重用代码,并使得向公共区域(如区域级的导航)添加内容成为一件轻松的工作。
以下是使用模板继承的一些诀窍:
如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。
一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越多越好。
如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。
如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。
不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。 也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。
{% extends %} 对所传入模板名称使用的加载方法和 get_template() 相同。 也就是说,会将模板名称被添加到 TEMPLATE_DIRS 设置之后。
多数情况下, {% extends %} 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也可以是个变量。 这使得你能够实现一些很酷的动态功能。

 

posted @ 2010-06-08 12:28  Phenix.  阅读(604)  评论(0编辑  收藏  举报