註明:python版本為3.3.1、Django版本為1.5.1,作業系統為Windows7,其他版本有一些不同的地方讀者可以自行探討。
在上一章你可能已經發現了這樣的問題,就是在檢視返回文字的時候,HTML程式碼被硬編碼在了python的程式碼中。如%s等等。像這樣寫往往使得程式更加複雜,一旦修改起來又顯得十分的麻煩,而且HTML程式碼程式設計師不見得會python程式碼,現在的開發一般都會使得HTML前臺頁面和Python後臺分離,也就是前臺只負責顯示頁面,後臺只負責處理資料和其他操作。因此,模板顯得尤為重要。
那麼,什麼是模板呢?
模板是一個文字,用於分離文件的表現形式和內容。 模板定義了佔位符以及各種用於規範文件該如何顯示的各部分基本邏輯(模板標籤)。 模板通常用於產生HTML,但是Django的模板也能產生任何基於文字格式的文件。下面我們從一個簡單的例子來學習下什麼是模板。(這個例子源自DjangoBook2)
<html> <head><title>Ordering notice</title></head> <body> <h1>Ordering notice</h1> <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> <p>Here are the items you've ordered:</p> <ul> {% for item in item_list %} <li>{{ item }}</li> {% endfor %} </ul> {% 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> </body> </html>
如上所示用{{...}}或者{%...%}來替代python程式碼的方式就是模板,像第一個{{person_name}}其實就是一個變數,而{%for....%}或者{% if ...%}等就是迴圈。先不去深究上面的程式碼的意思,我們下面一步一步來學習怎麼使用它。
>>> from django import template >>> t = template.Template('My name is {{ name }}.') >>> c = template.Context({'name': 'Adrian'}) >>> print(t.render(c)) My name is Adrian. >>> c = template.Context({'name': 'Fred'}) >>> print(t.render(c)) My name is Fred.
當你看到上面的程式碼時你可能會急不可耐的去嘗試,結果在第二行卻出現了錯誤。一般來說唯一可能出現的錯誤就是:'DJANGO_SETTINGS_MODULE'error,這是因為Django搜尋DJANGO_SETTINGS_MODULE環境變數時,它被設定在settings.py中,而直接啟動python shell就會導致它不知道用哪個配置檔案。例如,假設mysite在你的Python搜尋路徑中,那麼DJANGO_SETTINGS_MODULE應該被設定為:’mysite.settings’。所以為了免去設定環境變數的麻煩,我們應該這樣啟動python shell。
python manage.py shell
這樣可以免去你大費周章地去配置那些你不熟悉的環境變數。
下面我們來分析下那段程式碼。
>>> from django import template #從django中匯入template物件 >>> t = template.Template('My name is {{ name }}.') #使用template物件的Template()方法 >>> c = template.Context({'name': 'Adrian'}) #使用template物件的Context()函式給賦值,比如name的值就是Adrian,Context()的()裡面是一個字典 >>> print(t.render(c)) #渲染模板,也就是講Context賦值後的name的值Adrian替換上面Template()中的{{name}}並輸出 My name is Adrian. >>> c = template.Context({'name': 'Fred'}) >>> print(t.render(c)) My name is Fred.
從上面的例子可以看出,使用模板的三步。一、呼叫Template函式;二、呼叫Context函式;三、呼叫render函式。就這麼簡單。
下面我們再透過幾個程式碼來說說Context()函式。
#程式碼段1: >>> from django.template import Template,Context >>> t=Template('hello,{{name}}') >>> for name in ('A','B','C'): ... print(t.render(Context({'name':name}))) ... hello,A hello,B hello,C #程式碼段2: >>> from django.template import Template,Context >>> person={'name':'Thunder','age':'108'} >>> t=Template('{{person.name}} is {{person.age}} years old!') >>> c=Context({'person':person})#後面的這個person是一個字典 >>> t.render(c) 'Thunder is 108 years old!' #程式碼段3: >>> from django.template import Template,Context >>> t=Template('Item 2 is {{items.2}}')#items.2的意思是呼叫items列表的第3個元素,因為列表的索引是從0開始的 >>> c=Context({'items':['Apple','Banana','Orange']}) >>> t.render(c) 'Item 2 is Orange'
注意:上面的items.2不能是items.-1或者其他什麼負數索引。
好好觀察上面三段程式碼,是不是就舉一反三了呢?另外預設情況下,如果一個變數不存在,模板系統會把它展示為空字串,不做任何事情來表示失敗。