在Python的Django框架中加载模版的方法
为了减少模板加载调用过程及模板本身的冗余代码,Django提供了一种使用方便且功能强大的API,用于从磁盘中加载模板,
要使用此模板加载API,首先你必须将模板的保存位置告诉框架。设置的保存文件就是settings.py。
如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧。它的默认设置是一个空元组(tuple),加上一些自动生成的注释。
TEMPLATE_DIRS=( #Putstringshere,like"/home/html/django_templates"or"C:/www/django/templates". #Alwaysuseforwardslashes,evenonWindows. #Don'tforgettouseabsolutepaths,notrelativepaths. )
该设置告诉Django的模板加载机制在哪里查找模板。选择一个目录用于存放模板并将其添加到TEMPLATE_DIRS中:
TEMPLATE_DIRS=( '/home/django/mysite/templates', )
下面是一些注意事项:
你可以任意指定想要的目录,只要运行Web服务器的用户可以读取该目录的子目录和模板文件。如果实在想不出合适的位置来放置模板,我们建议在Django项目中创建一个templates目录。
如果你的TEMPLATE_DIRS只包含一个目录,别忘了在该目录后加上个逗号。
Bad:
#Missingcomma! TEMPLATE_DIRS=( '/home/django/mysite/templates' )Good:
#Commacorrectlyinplace. TEMPLATE_DIRS=( '/home/django/mysite/templates', )
Python要求单元素元组中必须使用逗号,以此消除与圆括号表达式之间的歧义。这是新手常犯的错误。
如果使用的是Windows平台,请包含驱动器符号并使用Unix风格的斜杠(/)而不是反斜杠(),就像下面这样:
TEMPLATE_DIRS=( 'C:/www/django/templates', )
最省事的方式是使用绝对路径(即从文件系统根目录开始的目录路径)。如果想要更灵活一点并减少一些负面干扰,可利用Django配置文件就是Python代码这一点来动态构建TEMPLATE_DIRS的内容,如:例如:
importos.path TEMPLATE_DIRS=( os.path.join(os.path.dirname(__file__),'templates').replace('\\','/'), )
这个例子使用了神奇的Python内部变量__file__,该变量被自动设置为代码所在的Python模块文件名。``os.path.dirname(__file__)``将会获取自身所在的文件,即settings.py所在的目录,然后由os.path.join这个方法将这目录与templates进行连接。如果在windows下,它会智能地选择正确的后向斜杠”“进行连接,而不是前向斜杠”/”。
在这里我们面对的是动态语言python代码,我需要提醒你的是,不要在你的设置文件里写入错误的代码,这很重要。如果你在这里引入了语法错误,或运行错误,你的Django-powered站点将很可能就要被崩溃掉。
完成TEMPLATE_DIRS设置后,下一步就是修改视图代码,让它使用Django模板加载功能而不是对模板路径硬编码。返回current_datetime视图,进行如下修改:
fromdjango.template.loaderimportget_template fromdjango.templateimportContext fromdjango.httpimportHttpResponse importdatetime defcurrent_datetime(request): now=datetime.datetime.now() t=get_template('current_datetime.html') html=t.render(Context({'current_date':now})) returnHttpResponse(html)
此范例中,我们使用了函数django.template.loader.get_template(),而不是手动从文件系统加载模板。该get_template()函数以模板名称为参数,在文件系统中找出模块的位置,打开文件并返回一个编译好的Template对象。
在这个例子里,我们选择的模板文件是current_datetime.html,但这个与.html后缀没有直接的联系。你可以选择任意后缀的任意文件,只要是符合逻辑的都行。甚至选择没有后缀的文件也不会有问题。
要确定某个模板文件在你的系统里的位置,get_template()方法会自动为你连接已经设置的TEMPLATE_DIRS目录和你传入该法的模板名称参数。比如,你的TEMPLATE_DIRS目录设置为'/home/django/mysite/templates',上面的get_template()调用就会为你找到/home/django/mysite/templates/current_datetime.html这样一个位置。
如果get_template()找不到给定名称的模板,将会引发一个TemplateDoesNotExist异常。要了解究竟会发生什么,让我们按照第三章内容,在Django项目目录中运行pythonmanage.pyrunserver命令,再次启动Django开发服务器。接着,告诉你的浏览器,使其定位到指定页面以激活current_datetime视图(如http://127.0.0.1:8000/time/)。假设你的DEBUG项设置为True,而你有没有建立current_datetime.html这个模板文件,你会看到Django的错误提示网页,告诉你发生了TemplateDoesNotExist错误。
ScreenshotofaTemplateDoesNotExisterror.
该页面与我们在第三章解释过的错误页面相似,只不过多了一块调试信息区:模板加载器事后检查区。该区域显示Django要加载哪个模板、每次尝试出错的原因(如:文件不存在等)。当你尝试调试模板加载错误时,这些信息会非常有帮助。
接下来,在模板目录中创建包括以下模板代码current_datetime.html文件:
<html><body>Itisnow{{current_date}}.</body></html>
在网页浏览器中刷新该页,你将会看到完整解析后的页面。