在Python的Django框架中加载模版的方法


Posted in Python onJuly 16, 2015

为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板,

要使用此模板加载API,首先你必须将模板的保存位置告诉框架。 设置的保存文件就是settings.py。

如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧。 它的默认设置是一个空元组(tuple),加上一些自动生成的注释。

TEMPLATE_DIRS = (
 # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
 # Always use forward slashes, even on Windows.
 # Don't forget to use absolute paths, not relative paths.
)

该设置告诉 Django 的模板加载机制在哪里查找模板。 选择一个目录用于存放模板并将其添加到 TEMPLATE_DIRS 中:

TEMPLATE_DIRS = (
 '/home/django/mysite/templates',
)

下面是一些注意事项:

    你可以任意指定想要的目录,只要运行 Web 服务器的用户可以读取该目录的子目录和模板文件。 如果实在想不出合适的位置来放置模板,我们建议在 Django 项目中创建一个 templates 目录。

    如果你的 TEMPLATE_DIRS只包含一个目录,别忘了在该目录后加上个逗号。 

Bad:

# Missing comma!
TEMPLATE_DIRS = (
 '/home/django/mysite/templates'
)
Good:
# Comma correctly in place.
TEMPLATE_DIRS = (
 '/home/django/mysite/templates',
)

    Python 要求单元素元组中必须使用逗号,以此消除与圆括号表达式之间的歧义。 这是新手常犯的错误。

    如果使用的是 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 模块文件名。 `` os.path.dirname(__file__)`` 将会获取自身所在的文件,即settings.py 所在的目录,然后由os.path.join 这个方法将这目录与 templates 进行连接。如果在windows下,它会智能地选择正确的后向斜杠”“进行连接,而不是前向斜杠”/”。

    在这里我们面对的是动态语言python代码,我需要提醒你的是,不要在你的设置文件里写入错误的代码,这很重要。 如果你在这里引入了语法错误,或运行错误,你的Django-powered站点将很可能就要被崩溃掉。

完成 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 对象。

在这个例子里,我们选择的模板文件是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 项目目录中运行 python manage.py runserver 命令,再次启动Django开发服务器。 接着,告诉你的浏览器,使其定位到指定页面以激活current_datetime视图(如 http://127.0.0.1:8000/time/ )。假设你的 DEBUG项设置为 True,而你有没有建立current_datetime.html 这个模板文件,你会看到Django的错误提示网页,告诉你发生了 TemplateDoesNotExist 错误。

Screenshot of a TemplateDoesNotExist error.

该页面与我们在第三章解释过的错误页面相似,只不过多了一块调试信息区: 模板加载器事后检查区。 该区域显示 Django 要加载哪个模板、每次尝试出错的原因(如:文件不存在等)。 当你尝试调试模板加载错误时,这些信息会非常有帮助。

接下来,在模板目录中创建包括以下模板代码 current_datetime.html 文件:

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

在网页浏览器中刷新该页,你将会看到完整解析后的页面。

Python 相关文章推荐
python实现的一个p2p文件传输实例
Jun 04 Python
Python赋值语句后逗号的作用分析
Jun 08 Python
python 实现在Excel末尾增加新行
May 02 Python
对python requests的content和text方法的区别详解
Oct 11 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
Python @property使用方法解析
Sep 17 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 Python
Django框架下在视图中使用模版的方法
Jul 16 #Python
详解Django中的过滤器
Jul 16 #Python
在Python的Django框架中为代码添加注释的方法
Jul 16 #Python
详解Django中的ifequal和ifnotequal标签使用
Jul 16 #Python
Python实现数通设备端口使用情况监控实例
Jul 15 #Python
Python实现快速多线程ping的方法
Jul 15 #Python
Python实现将目录中TXT合并成一个大TXT文件的方法
Jul 15 #Python
You might like
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
php array_pop 删除数组最后一个元素实例
2016/11/02 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
&amp;lt;script defer&amp;gt; defer 是什么意思
2009/05/10 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python Socket使用实例
2017/12/18 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
敬老模范事迹
2014/05/21 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
教师演讲稿开场白
2014/08/25 职场文书
离婚财产处理协议书
2014/09/30 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
意外事故赔偿协议书
2016/03/22 职场文书
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers