Django框架中的Context使用

Django框架中的Context使用

2017年11月09日 20:01:09 aweilark 阅读数:1113

转载自:http://www.aichengxu.com/python/60625.htm

一旦你创建一个 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 模板渲染引擎要慢上几个数量级。

原文地址:https://www.cnblogs.com/zpaixx/p/10566777.html

时间: 2024-08-04 14:50:24

Django框架中的Context使用的相关文章

Python的Django框架中的Context使用

Python的Django框架中的Context使用 一旦你创建一个 Template 对象,你可以用 context 来传递数据给它. 一个context是一系列变量和它们值的集合. context在Django里表现为 Context 类,在 django.template 模块里. 她的构造函数带有一个可选的参数: 一个字典映射变量和它们的值. 调用 Template 对象 的 render() 方法并传递context来填充模板: >>> from django.template

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

在Python的Django框架中加载模版的方法 为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板, 要使用此模板加载API,首先你必须将模板的保存位置告诉框架. 设置的保存文件就是settings.py. 如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧. 它的默认设置是一个空元组(tuple),加上一些自动生成的注释. TEMPLATE_DIRS =

Python的Django框架中的Cookie相关处理

Python的Django框架中的Cookie相关处理 浏览器的开发者在很早的时候就已经意识到, HTTP's 的无状态会对Web开发者带来很大的问题,于是(cookies)应运而生. cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies 来看看它是怎么工作的. 当你打开浏览器并访问 google.com ,你的浏览器会给Google发送一个HTTP请求,起始部分就象这样: GET / HTTP/1.1 Host:

Django框架中tinymce富文本编辑器的使用

1. 安装富文本模块 pip install tinymce 2. Django项目中注册添加配置. Setting文件中应用注册 'tinymce', 添加tinymce的基本设置.(高级-长600-宽-400) TINYMCE_DEFAULT_CONFIG = { 'theme': 'advanced', 'width': 600, 'height': 400, }  3. urls配置 添加tinymce配置 url(r'^tinymce/', include('tinymce.urls'

对Django框架中Cookie的简单理解

概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在你一次请求结束后她会很快忘掉你的,对她来说你的每一次请求都是新鲜的,这要是爱情就好了哈,可以爱情保鲜!闲话不多说,这种状态就是所谓的 "浏览器请求服务器是无状态",根本原因就复杂一些了,需要简单了解些网络编程中套接字Socket的通信方式,简单来说就是,浏览器和服务器进行通信需要使用Soc

django框架中的缓存系统

一.浏览器的缓存机制 Cache-Control策略: Cache-Control和Expires的作用相似,即指出当前资源的有效期,控制浏览器是直接从浏览器缓存获取数据还是发送Request到服务端获取数据,只不过Cache-Control的选择方式更多,设置详细,如果要同时设置,优先级高于Expires. Cache-Control: max-age=10,即设置缓存存储的最大周期为10s,这和Date与Expires的差值相对应,private表明响应只能被单个用户缓存,不能作为共享缓存(

python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)

阅读目录 F查询和Q查询 事务 一.F查询和Q查询 1.F查询 查询前的准备 class Product(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=10, decimal_places=2) # 库存数 inventory = models.IntegerField() # 卖出数 sale = models.IntegerField() def __s

Django框架中使用支付宝在线支付API

一.蚂蚁金服开发平台申请测试账号 a. 登陆蚂蚁金服开放平台https://open.alipay.com/platform/manageHome.htm,在"开发中心"-"研发服务"下拉处选择沙箱作为测试环境. b. 填写相关信息,成功申请沙箱账号后进入沙箱环境页面 c.下载沙箱钱包(目前仅支持安卓手机) d. 使用沙箱账号处的买家账号登陆下载好的沙箱钱包 二.制作公钥和密钥 a.制作应用私钥和公钥 在沙箱应用处点击查看应用公钥 在显示的应用公钥处点击修改 在点击

django框架中的cookie与session

cookie因为http是一个无状态协议,无法记录用户上一步的操作,所以需要状态保持.cookie和session的区别:1.cookie是保存在浏览器本地的,所以相对不安全.cookie是4k的大小,最多保存20条(因为最原始的浏览器的本地是很小的,只是一个历史数据,但是其实是不精确的),默认的过期时间是14天.2.session是保存在服务器的,是相对安全的,session依赖于cookie,sessionid保存在cookie中,理论上无大小限制.3.相同点:都是实现状改保持,都是有服务器