Django 快速实战入门(四):模板系统

作者:Hily 原始链接:http://hily.me/blog/2008/11/learning-django-ch4/
版权声明:可以转载,转载时务必以超链接形式标明文章原始出处作者信息版权声明

在上一节,我们通过一个简单的示例演示了 Django 视图控制的工作过程。

仔细观察我们可以发现,现在的数据和显示是混合在一起的,这样不利于分工和代码维护。

Django 的模板系统可以帮助我们解决这个问题。模板引擎其实是个数据渲染引擎,它将数据以一定的结构和样式格式化后输出。

实现数据与显示分离

下面,我们通过使用 Django 的模板系统将上一节示例中的数据和显示分离:

from django.http import HttpResponse
from django.template import Context, Template

def index(request):
    t = Template('<html><body>client ip: {{ ip }}</body></html>')
    c = Context({'ip': request.META['REMOTE_ADDR']})
    html = t.render(c)
    return HttpResponse(html)

乍一看,虽然数据和显示分离了,但似乎还没有原来的简洁,模板和代码混合在一起,而且代码行数增加了。

这时你可能想到把模板存储为文件,在渲染时通过文件操作读入模板内容,这样就太繁琐了。

Django 已经为我们提供了这样一个简便易用的渲染接口:render_to_response。

通过指定模板文件和数据集合,render_to_response 可以轻易将数据格式化并返回一个 HttpResponse 对象。

修改以上代码,在 myblog 目录下新建一个专门用于存放模板的目录 templates,然后在其中新建 index.html:

<html><body>client ip: {{ ip }}</body></html>

然后我们需要修改 settings.py,把 templates 目录的绝对路径加入到 TEMPLATE_DIRS 变量中,告诉 Django 我们的模板所保存的目录:

TEMPLATE_DIRS = (
    '/root/myblog/templates',
)

大多数情况下我们不喜欢使用绝对路径,因为在代码存放路径改变时又要重新修改设置,因此我们可以使用一种更加灵活的方式:

import os.path

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

改好后,重新打开页面查看一下效果:http://192.168.1.6:8080/

模板系统语法

在上面的模板中,我们只使用到一个模板变量 {{ ip }},这还不足以展示出模板系统的强大。

除了模板变量,Django 的模板系统还提供了模板标签和模板过滤器这两种机制,通过这些标签和过滤器我们可以轻易的实现条件判断、循环遍历、格式化等各种实用功能。

模板标签使用 {% 和 %} 括起来,如 {% if %} {% else %} {% endif %} 等。

Django 内建的大量丰富实用的模板标签,基本上可以满足大部分场合的应用需求。

过滤器作用于模板变量,通过在变量名后加上 | 和过滤器名及参数实现,如:{{ birthdate | date: "Y-m-d"}} 将输出类似 1985-02-13。

在内建的标签或过滤器不足以满足我们的要求的情况下,我们可以自己编码实现自定义的标签和过滤器。

此文是帮助大家快速了解和上手 Django,而不是 Django 的中文手册。因此关于这些标签和过滤器的具体用法,请参考官方文档(在本文第一节中有提到)。

使用标签和过滤器

接下来我们要再修改以上例子,通过输出 request.META 中的所有元素,来演示一下模板标签和模板过滤器的用法。

views.py:

from django.http import HttpResponse
from django.shortcuts import render_to_response

def index(request):
    return render_to_response('index.html', {'meta': request.META})

templates/index.html

<html><body>
<ul>
{% for meta_name, meta_value in meta.items %}
  <li style="background-color: {% cycle '#ddd' '#ccc' %}">
    {{ meta_name }}: {{ meta_value|default:"No value" }}
  </li>
{% endfor %}
</ul>
</body></html>

for 循环将 meta.items 中的项目依次遍历,cycle 用于在 for 循环中不断地切换行的背景颜色,当 meta_value 为空时,通过 default 过滤器将显示为“No value”。

输出结果类似如下:

image

下一节 >>>

Django 快速实战入门(五):数据模型

通过 Django 的 ORM 机制,体验一下无 SQL 编程带来的快感。

-- EOF --

不是吧,只有一条评论?! »

  1. 藏宝图» Blog Archive » Django 快速实战入门(四):模板系统 说道:

    2009年03月19日 22:18

    [...] 原始链接:http://hily.me/blog/2008/11/learning-django-ch4/ [...]

发表一下您的高见

If you have any question, or for the language problem, please fell free to leave a comment or just contact me with email: hilyjiang [At] Gmail.