Python的Django架構中的Context使用

來源:互聯網
上載者:User
一旦你建立一個 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 OutdoorEquipment. It's scheduled to\nship on April 2, 2009.

\n\n\n

Youdidn't order a warranty, so you're on your own when\nthe productsinevitably 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()方法渲染會更為高效:

# 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 模板解析非常快捷。 大部分的解析工作都是在後台通過對簡短Regex一次性調用來完成。 這和基於 XML 的模板引擎形成鮮明對比,那些引擎承擔了 XML 解析器的開銷,且往往比 Django 模板渲染引擎要慢上幾個數量級。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.