1. 程式人生 > >Django的render(模板渲染)機制

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 模板渲染引擎要慢上幾個數量級