• Django的模板渲染(render)机制

    用context来传递数据
    服务器君一共花费 20.424 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

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

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [Python程序设计] 标准库:urllib/urllib2 14 个条目
  2. [Python程序设计] Tornado源码解析 23 个条目
  3. [移动开发] 刷机与root相关 2 个条目
  4. [数据库技术] MySQL中英文混合排序 4 个条目
  5. [移动开发] Android布局基本知识 3 个条目
  6. [移动开发] Android属性系统Property 9 个条目
  7. [Python程序设计] Tornado表单处理 3 个条目
  8. [软件工程与项目管理] 浏览器的HTML解析器 8 个条目
  9. [PHP程序设计] PHP数组的遍历 7 个条目
  10. [运维管理] 防火墙原理与应用 5 个条目
  11. [移动开发] 简单了解Android Fragment 3 个条目
  12. [移动开发] Android 开发调试工具 ADB 3 个条目
窗口 -- [博客]