Django之html模板继承

在使用Django进行web开发时,往往会构造一个基础框架模板即base.html,而后在其子模板中对它所包含站点公用部分和定义块进行重载。

首先创建一个base.html,源码为:

[html] view plain copy print?
<!DOCTYPE html>  
<html>  
<head>  
<meta charset="UTF-8">  
<title>{% block title %}{% endblock %}</title>  
</head>  
<body>  
    <h1>My helpful timestamp site</h1>  
    {% block content %}{% endblock %}  
    {% block footer %}  
    <hr>  
    <p>Thanks for visiting my site.</p>  
    {% endblock%}  
</body>  
</html>  

这个叫做base.html的模板定义了一个简单的html框架文档,等会我们将在我们的站点中的页面使用它。子模板的作用就是重载、添加或保留那些块的内容。

现在新建一个current_datetime.html模板来使用它:

{% extends "base.html" %}  
{% block title %}Future time{% endblock %}  
  
{% block content %}  
<p>In {{hour_offset }} hour(s),it will be {{next_time}}.</p>  
{% endblock  %}  

 

再新建一个hours_ahead.html模板,源码为:

{% extends "base.html" %}  
{% block title %}Future time{% endblock %}  
  
{% block content %}  
<p>In {{hour_offset }} hour(s),it will be {{next_time}}.</p>  
{% endblock  %}  

 

上面的部分非html标签等会再来解释它,现在在views.py中新建两个函数,index4,与index5,分别对应这两个模板。源码为:

 

def index4(req,offset):  
    offset=int(offset)  
    next_time=datetime.datetime.now()+datetime.timedelta(hours=offset)  
    return render_to_response("hours_ahead.html",{'hour_offset':offset,'next_time':next_time})  
  
def index5(req):  
    now=datetime.datetime.now()  
    return render_to_response('current_datetime.html',{'current_date':now})

 

在url中的配置为:

 

url(r'^hours_ahead/(\d{1,2}$)','blog.views.index4'),  
url(r'^current_datetime/$','blog.views.index5'),

现在启动服务器,在浏览器中查看效果,current_datetime.html为:

 

hours_ahead.html中的效果为:

如此两个html效果就显示出来了,同时也解释一下base.html中所起的作用,两个html中都使用了{% extends  %}标记,

这个就是继承base.html中的内容,在使用{ % block XXXXX %}    {% endblock%}时,中间的内容便是插入在使用了base.html两个标签的

中间,由此便极大的避免了代码的冗余。每个模板只包含自己独一无二的代码,无需多余的部分,而如果想要进行站点级的设计修改,仅需

修改base.html,所有其他模板会立即反映出所做修改。

上述,便是django之继承使用base.html模板。

 

 

你可以根据需要使用任意多的继承次数。 使用继承的一种常见方式是下面的三层法:

  •     创建 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 %} 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也可以是个变量。 这使得你能够实现一些很酷的动态功能。

转载于:https://my.oschina.net/aslanjia/blog/835226

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值