[Django模板系统]Django的模板渲染(render)机制

来源:互联网 发布:java string int 编辑:程序博客网 时间:2024/05/18 08:47

        注:以下内容转载自 现代魔法学院 网站的 Django的模板渲染(render)机制 一文,仅供学习使用。

       一旦你创建一个 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' : 'nowamagic'})>>> t.render(c)u'My name is nowamagic.'

       我们必须指出的一点是,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 OutdoorEquipment. It's scheduled to\nship on April 2, 2009.</p>\n\n\n<p>Youdidn't order a warranty, so you're on your own when\nthe productsinevitably 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() 方法渲染会更为高效:

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

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

0 0
原创粉丝点击