Python的Django框架中的Context使用
admin
2023-07-31 02:25:51
0

一旦你创建一个 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 = \"\"\"

Dear {{ person_name }},

... ...

Thanks for placing an order from {{ company }}. It\'s scheduled to ... ship on {{ ship_date|date:\"F j, Y\" }}.

... ... {% if ordered_warranty %} ...

Your warranty information will be included in the packaging.

... {% else %} ...

You didn\'t order a warranty, so you\'re on your own when ... the products inevitably stop working.

... {% endif %} ... ...

Sincerely,
{{ company }}

\"\"\" >>> 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\"

Dear John Smith,

\\n\\n

Thanks for placing an order from Outdoor Equipment. It\'s scheduled to\\nship on April 2, 2009.

\\n\\n\\n

You didn\'t order a warranty, so you\'re on your own when\\nthe products inevitably stop working.

\\n\\n\\n

Sincerely,
Outdoor Equipment

\"

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

    首先我们导入 (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 模板渲染引擎要慢上几个数量级。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...