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 對象而不是普通的字符串。 它 對 Unicode 的支持,將讓你的應用程序輕鬆地處理各式各樣的字符集,而不僅僅是基本的A-Z英文字符。

字典和Contexts
Python 的字典數據類型就是關鍵字和它們值的一個映射。 Context 和字典很類似, Context 還提供更多的功能。
變量名必須由英文字符開始 (A-Z或a-z)並可以包含數字字符、下劃線和小數點。 (小數點在這裏有特別的用途,稍後我們會講到)變量是大小寫敏感的。

同一模板,多個上下文
一旦有了 模板 對象,你就可以通過它渲染多個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

首先我們導入 (import)類 Template 和 Context ,它們都在模塊 django.template 裏。
接下來,我們創建了一個模板對象 t ,把 raw_template 作爲 Template 類構造函數的參數。
然後,我們創建一個 Context 對象, c 。 Context 構造的參數是 Python 字典數據類型。 在這裏,我們指定參數 person_name 的值是 ‘John Smith’ , 參數 company 的值爲 ‘Outdoor Equipment’ 等等。
最後,我們在模板對象上調用 render() 方法,傳遞 context 參數給它。 這是返回渲染後的模板的方法,它會替換模板變量爲真實的值和執行塊標籤。
這就是使用 Django 模板系統的基本規則: 寫模板,創建 Template 對象,創建 Context , 調用 render() 方法。
無論何時我們都可以像這樣使用同一模板源渲染多個context,只進行 一次模板創建然後多次調用render()方法渲染會更爲高效:

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

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

速度優勢:Django 模板解析非常快捷。 大部分的解析工作都是在後臺通過對簡短正則表達式一次性調用來完成。 這和基於 XML 的模板引擎形成鮮明對比,那些引擎承擔了 XML 解析器的開銷,且往往比 Django 模板渲染引擎要慢上幾個數量級

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章