Python的Django框架中的Context使用


Posted in Python onJuly 15, 2015

一旦你创建一个 Template 对象,你可以用 context 来传递数据给它。 一个context是一系列变量和它们值的集合。

context在Django里表现为 Context 类,在 django.template 模块里。 她的构造函数带有一个可选的参数: 一个字典映射变量和它们的值。 调用 Template 对象 的 render() 方法并传递context来填充模板:

>>> from django.template import Context, Template
>>> t = Template('My name is {{ name }}.')
>>> c = Context({'name': 'Stephane'})
>>> t.render(c)
u'My name is Stephane.'

我们必须指出的一点是,t.render(c)返回的值是一个Unicode对象,不是普通的Python字符串。 你可以通过字符串前的u来区分。 在框架中,Django会一直使用Unicode对象而不是普通的字符串。 如果你明白这样做给你带来了多大便利的话,尽可能地感激Django在幕后有条不紊地为你所做这这么多工作吧。 如果不明白你从中获益了什么,别担心。你只需要知道Django对Unicode的支持,将让你的应用程序轻松地处理各式各样的字符集,而不仅仅是基本的A-Z英文字符。

字典和Contexts

Python的字典数据类型就是关键字和它们值的一个映射。 Context 和字典很类似, Context 还提供更多的功能。

变量名必须由英文字符开始 (A-Z或a-z)并可以包含数字字符、下划线和小数点。 (小数点在这里有特别的用途,稍后我们会讲到)变量是大小写敏感的。

下面是编写模板并渲染的示例:

>>> from django.template import Template, Context
>>> raw_template = """<p>Dear {{ person_name }},</p>
...
... <p>Thanks for placing an order from {{ company }}. It's scheduled to
... ship on {{ ship_date|date:"F j, Y" }}.</p>
...
... {% if ordered_warranty %}
... <p>Your warranty information will be included in the packaging.</p>
... {% else %}
... <p>You didn't order a warranty, so you're on your own when
... the products inevitably stop working.</p>
... {% endif %}
...
... <p>Sincerely,<br />{{ company }}</p>"""
>>> t = Template(raw_template)
>>> import datetime
>>> c = Context({'person_name': 'John Smith',
...   'company': 'Outdoor Equipment',
...   'ship_date': datetime.date(2009, 4, 2),
...   'ordered_warranty': False})
>>> t.render(c)
u"<p>Dear John Smith,</p>\n\n<p>Thanks for placing an order from Outdoor
Equipment. It's scheduled to\nship on April 2, 2009.</p>\n\n\n<p>You
didn't order a warranty, so you're on your own when\nthe products
inevitably stop working.</p>\n\n\n<p>Sincerely,<br />Outdoor Equipment
</p>"

让我们逐步来分析下这段代码:

    首先我们导入 (import)类 Template 和 Context ,它们都在模块 django.template 里。

    我们把模板原始文本保存到变量 raw_template 。注意到我们使用了三个引号来 标识这些文本,因为这样可以包含多行。

    接下来,我们创建了一个模板对象 t ,把 raw_template 作为 Template 类构造函数的参数。

    我们从Python的标准库导入 datetime 模块,以后我们将会使用它。

    然后,我们创建一个 Context 对象, c 。 Context 构造的参数是Python 字典数据类型。 在这里,我们指定参数 person_name 的值是 'John Smith' , 参数company 的值为 ‘Outdoor Equipment' ,等等。

    最后,我们在模板对象上调用 render() 方法,传递 context参数给它。 这是返回渲染后的模板的方法,它会替换模板变量为真实的值和执行块标签。

    注意,warranty paragraph显示是因为 ordered_warranty 的值为 True . 注意时间的显示, April 2, 2009 , 它是按 'F j, Y' 格式显示的。

    如果你是Python初学者,你可能在想为什么输出里有回车换行的字符('\n' )而不是 显示回车换行? 因为这是Python交互解释器的缘故: 调用 t.render(c) 返回字符串, 解释器缺省显示这些字符串的 真实内容呈现 ,而不是打印这个变量的值。 要显示换行而不是 '\n' ,使用 print 语句: print t.render(c) 。

这就是使用Django模板系统的基本规则: 写模板,创建 Template 对象,创建 Context , 调用 render() 方法。

同一模板,多个上下文

一旦有了 模板 对象,你就可以通过它渲染多个context, 例如:

>>> from django.template import Template, Context
>>> t = Template('Hello, {{ name }}')
>>> print t.render(Context({'name': 'John'}))
Hello, John
>>> print t.render(Context({'name': 'Julie'}))
Hello, Julie
>>> print t.render(Context({'name': 'Pat'}))
Hello, Pat

无论何时我们都可以像这样使用同一模板源渲染多个context,只进行 一次模板创建然后多次调用render()方法渲染会更为高效:

# Bad
for name in ('John', 'Julie', 'Pat'):
  t = Template('Hello, {{ name }}')
  print t.render(Context({'name': name}))

# Good
t = Template('Hello, {{ name }}')
for name in ('John', 'Julie', 'Pat'):
  print t.render(Context({'name': name}))

Django 模板解析非常快捷。 大部分的解析工作都是在后台通过对简短正则表达式一次性调用来完成。 这和基于 XML 的模板引擎形成鲜明对比,那些引擎承担了 XML 解析器的开销,且往往比 Django 模板渲染引擎要慢上几个数量级。

Python 相关文章推荐
python 获取当天每个准点时间戳的实例
May 22 Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
pycharm配置pyqt5-tools开发环境的方法步骤
Feb 11 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
浅析python的Lambda表达式
Feb 27 Python
Ubuntu18.04下python版本完美切换的解决方法
Jun 14 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
Python使用selenium + headless chrome获取网页内容的方法示例
Oct 16 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
python列表返回重复数据的下标
Feb 10 Python
在Python的Django框架中创建和使用模版
Jul 15 #Python
详解Python的Django框架中的模版相关知识
Jul 15 #Python
Django中处理出错页面的方法
Jul 15 #Python
在Django中创建动态视图的教程
Jul 15 #Python
Python的Django框架中的URL配置与松耦合
Jul 15 #Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 #Python
在Django中创建第一个静态视图
Jul 15 #Python
You might like
德劲1103二次变频版的打磨
2021/03/02 无线电
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
Python3搜索及替换文件中文本的方法
2015/05/22 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
建筑工程实习自我鉴定
2013/09/19 职场文书
大客户销售经理职责
2013/12/04 职场文书
银行存款证明样本
2014/01/17 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
学校教师安全责任书
2014/07/23 职场文书
简单租房协议书
2014/10/21 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL
React更新渲染原理深入分析
2022/12/24 Javascript