在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程序抓取新浪在国内的所有IP的教程
May 04 Python
Python学习小技巧之利用字典的默认行为
May 20 Python
python 找出list中最大或者最小几个数的索引方法
Oct 30 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
Jan 08 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
Django实现分页显示效果
Oct 31 Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 Python
tensorflow mnist 数据加载实现并画图效果
Feb 05 Python
python的列表List求均值和中位数实例
Mar 03 Python
python字符串的index和find的区别详解
Jun 20 Python
python time()的实例用法
Nov 03 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生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
python搭建微信公众平台
2016/02/09 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
wxPython实现分隔窗口
2019/11/19 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
高校师德师风自我剖析材料
2014/09/29 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
安全教育观后感
2015/06/17 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL