您的位置:首页 > 编程语言 > Go语言

django在视图中使用模板

2011-09-18 19:50 525 查看
在学习了模板系统的基础之后,现在让我们使用相关知识来创建视图。重新打开我们在前一

章在 mysite.views 中创建的 current_datetime 视图。以下是其内容:

from django.http import HttpResponse

import datetime

def current_datetime(request):

now = datetime.datetime.now()

html = "<html><body>It is now %s.</body></html>" % now

return HttpResponse(html)

让我们用 Django 模板系统来修改该视图。

第一步,

你可能已经想到了要做下面这样的修改:

from django.template import Template, Context

from django.http import HttpResponse

import datetime

def current_datetime(request):

now = datetime.datetime.now()

t = Template("<html><body>It is now {{ current_date }}.</body></html>")

html = t.render(Context({'current_date': now}))

return HttpResponse(html)

没错,它确实使用了模板系统,但是并没有解决我们在本章开头所指出的问题。也就是说,

模板依燃内嵌在 Python 代码之中。让我们将模板置于一个 单独的文件 中,并且让视图加

载该文件来解决此问题。

你可能首先考虑把模板保存在文件系统的某个位置并用 Python 内建的文件操作函数来读取

文件内容。假设文件保存在 /home/djangouser/templates/mytemplate.html 中的话,代码

就会像下面这样:

from django.template import Template, Context

from django.http import HttpResponse

import datetime

def current_datetime(request):

now = datetime.datetime.now()

# Simple way of using templates from the filesystem.

# This doesn't account for missing files!

fp = open('/home/djangouser/templates/mytemplate.html')

t = Template(fp.read())

fp.close()

html = t.render(Context({'current_date': now}))

return HttpResponse(html)

然而,基于以下几个原因,该方法还算不上简洁:

它没有对文件丢失的情况做出处理。如果文件 mytemplate.html 不存在或者不可读, open() 函数调用将会引发 IOError 异常。这里对模板文件的位置进行了硬编码。如果你在每个视图函数都用该技术,就要不断复制这些模板的位置。更不用说还要带来大量的输入工作!它包含了大量令人生厌的重复代码。与其在每次加载模板时都调用 open() ,fp.read() 和 fp.close() ,还不如做出更佳选择。

要解决此问题,我们将使用 模板加载 和 模板目录 ,这是我们在接下来的章节中要讨论的两个话题。

模板加载

为了减少模板加载调用过程及模板本身的冗余代码,

Django 提供了一种使用方便且功能强大

的 API ,用于从磁盘中加载模板,

要使用此模板加载 API,首先你必须将模板的保存位置告诉框架。该项工作在 设置文件 中完成。

Django 设置文件是存放 Django 实例(也就是 Django 项目)配置的地方。它是一个简单的Python 模块,其中包含了一些模块级变量,每个都是一项设置。第二章中执行 django-admin.py startproject mysite 命令时,它为你创建了一个的缺省配置文件,并恰如其分地将其名为 settings.py 。查看一下该文件内容。其中包含如下变量(但并不一定是这个顺序):

DEBUG = True

TIME_ZONE = 'America/Chicago'

USE_I18N = True

ROOT_URLCONF = 'mysite.urls'

这里无需更多诠释;设置项与值均为简单的 Python 变量。同时由于配置文件只不过是纯Python 模块,你可以完成一些动态工作,比如在设置某变量之前检查另一变量的值。(这也意味着你必须避免配置文件出现 Python 语法错误。)

我们将在附录 E 中详述配置文件,目前而言,仅需关注 TEMPLATE_DIRS 设置。该设置告诉

Django 的模板加载机制在哪里查找模板。缺省情况下,该设置的值是一个空的元组。选择一

个目录用于存放模板并将其添加到 TEMPLATE_DIRS 中:

TEMPLATE_DIRS = (

'/home/django/mysite/templates',

)

下面是一些注意事项:

你可以任意指定想要的目录,只要运行 Web 服务器的用户账号可以读取该目录的子目录和模板文件。如果实在想不出合适的位置来放置模板,我们建议在 Django 项目中创建一个templates 目录(也就是说,如果你一直都按本书的范例操作的话,在第二章创建的 mysite目录中)。

不要忘记模板目录字符串尾部的逗号!Python 要求单元素元组中必须使用逗号,以此消除与圆括号表达式之间的歧义。这是新手常犯的错误。想避免此错误的话,你可以将列表而不是元组用作 TEMPLATE_DIRS ,因为单元素列表并不强制要求以逗号收尾:

TEMPLATE_DIRS = [

'/home/django/mysite/templates'

]

从语义上看,元组比列表略显合适(元组在创建之后就不能修改,而配置被读取以后就不应该有任何修改)。因此,我们推荐对 TEMPLATE_DIRS 设置使用元组。如果使用的是 Windows 平台,请包含驱动器符号并使用 Unix 风格的斜杠(/)而不是反斜杠(\),就像下面这样:

TEMPLATE_DIRS = (

'C:/www/django/templates',

)

最省事的方式是使用绝对路径(即从文件系统根目录开始的目录路径)。如果想要更灵活一点并减少一些负面干扰,可利用 Django 配置文件就是 Python 代码这一点来动态构建TEMPLATE_DIRS 的内容,如:

import os.path

TEMPLATE_DIRS = (

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

)

这个例子使用了神奇的 Python 内部变量 __file__ ,该变量被自动设置为代码所在的

Python 模块文件名。

完成 TEMPLATE_DIRS 设置后,下一步就是修改视图代码,让它使用 Django 模板加载功能而不是对模板路径硬编码。返回 current_datetime 视图,进行如下修改:

from django.template.loader import get_template

from django.template import Context

from django.http import 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)

此范例中,我们使用了函数 django.template.loader.get_template() ,而不是手动从文件系统加载模板。 get_template() 函数以模板名称为参数,该在文件系统中找出模块的位置,打开文件并返回一个编译好的 Template 对象。如果 get_template() 找不到给定名称的模板,将会引发一个 TemplateDoesNotExist 异常。要了解究竟会发生什么,让我们按照第三章内容,在 Django 项目目录中运行 pythonmanage.py runserver
命令,再次启动 Django 开发服务器。。然后,用浏览器访问页面(如:http://127.0.0.1:8000/time/ ) 激活 current_datetime 视图。假如 DEBUG 设置为 True而又未创建 current_datetime.html 模板,你将会看到 TemplateDoesNotExist 错误信息页面。

该页面与我们在第三章解释过的错误页面相似,只不过多了一块调试信息区:模板加载器事后检查区。该区域显示 Django 要加载哪个模板、每次尝试出错的原因(如:文件不存在等)。在调试模板加载错误时,这些信息的价值是不可估量的。正如你从图 4-1 中的错误信息中所看到,Django 尝试通过组合 TEMPLATE_DIRS 设置以及传递给 get_template() 的模板名称来查找模板。因此如果 TEMPLATE_DIRS 为'/home/django/templates' ,Django 将会 查找'/home/django/templates/current_datetime.html'
。如果 TEMPLATE_DIRS 包含多个目录,它将会查找每个目录直至找到模板或找遍所有目录。接下来,在模板目录中创建包括以下模板代码 current_datetime.html 文件:

<html><body>It is now {{ current_date }}.</body></html>

在网页浏览器中刷新该页,你将会看到完整解析后的页面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: