django学习系列之模板系统篇(二)

这篇文章讲怎么在视图中使用模板。只会说没用,用起来才是真的。

这里必须提到一个新概念了:模板目录。在模板目录里面,你存放了一堆模板文件。

怎么让系统找到模板目录呢?靠设置文件。

在项目中找到settings.py文件,找到TEMPLATE_DIRS,在这一项里面添加你的模板目录位置。

Linux系统下有两种添加方法:

1.使用绝对路径。比如:

TEMPLATE_DIRS = (
'/home/django/mysite/templates', #结尾要有逗号
)

2.使用内部变量__file__,改变量被自动设置为代码所在的python模块文件名。比如:

TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__),'templates').replace(' \\','/'),
)

settings.py所在目录下查找templates目录。

先看一个例子。

fromdjango.template.loader import get_template
fromdjango.template import Context
from django.httpimport HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

前面也用过这个例子,不解释了。这是一种用法,使用HttpResponse()方法。

但是应答http请求的操作太常用了,django提供了一个快捷的方法,位于django.shortcuts模块中名为render_to_response()的方法。

使用render_to_response()方法,上面的代码可以简化为:

from django.httpimport render_to_response
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date': now})

render_to_response()的第一个参数必须是要使用的模板名称。如果要给定第二个参数,那么该参数必须是为该模板创建Context时所使用的字典。如果不提供第二个参数,render_to_response()使用一个空字典。

写过web的人都知道html文档的内容实在多,要是能够重用,那就太好了。

重用的第一种方法是使用{%include %}标签,第二种方法就是模板继承

下面重点将第二种方法,第一种方法参考标签的用法。

模板继承,从本质上来说就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。跟类继承的概念差不多。

直接上示例:

假设一个文件base.html

<!DOCTYPEHTML>
<htmllang="en">
<head>
<title>{%block title %}{% endblock %}</title>
</head>
<body>
<h1>Myhelpful timestamp site</h1>
{% blockcontent %}{% endblock %}
{% blockfooter %}
<hr>
<p>Thanksfor visiting my site.</p>
{% endblock%}
</body>
</html>

我们使用了一个新的标签:{%block %},它告诉模板引擎,子模板可以重载这些部分。

继承会用到一个{%extend %}标签,继承后的文件current_datetime.html,请看:

{% extends"base.html" %}

{% block title%}The current time{% endblock %}
{% block content%}

<p>It isnow {{ current_date }}.</p>
{% endblock %}

工作方式:在加载current_datetime.html模板时,模板引擎发现了{%extend %}标签,意识到该模板是一个子模板,所以立即装载其父模板,即本例中的base.html

此时,模板引擎注意到base.html中的三个{%block %}标签,并用子模板的内容替换这些block。因此,引擎将会使用我们在{% block title %}中定义的标题,对{% block content %}也一样。

注意由于子模板并没有定义footer块,模板系统将使用在父模板中定义的值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值