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多进程同步Lock、Semaphore、Event实例
Nov 21 Python
Python写的英文字符大小写转换代码示例
Mar 06 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
使用Python来编写HTTP服务器的超级指南
Feb 18 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
python简单实现获取当前时间
Aug 27 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
python安装教程
Feb 28 Python
Pycharm更换python解释器的方法
Oct 29 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
python生成xml时规定dtd实例方法
Sep 21 Python
Python sklearn分类决策树方法详解
Sep 23 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
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
jquery分页插件AmSetPager(自写)
2013/04/15 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
微信小程序手机号码验证功能的实例代码
2018/08/28 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
Python global全局变量函数详解
2018/09/18 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
python线性插值解析
2020/07/05 Python
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
幼儿园毕业教师感言
2014/02/21 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android