註明:python版本為3.3.1、Django版本為1.5.1,作業系統為Windows7,其他版本有一些不同的地方讀者可以自行探討。
在上一章你可能已經發現了這樣的問題,就是在視圖返回文本的時候,HTML代碼被硬編碼在了python的代碼中。如%s等等。像這樣寫往往使得程式更加複雜,一旦修改起來又顯得十分的麻煩,而且HTML程式設計師不見得會python程式碼,現在的開發一般都會使得HTML前台頁面和Python後台分離,也就是前台只負責顯示頁面,後台只負責處理資料和其他操作。因此,模板顯得格外重要。
那麼,什麼是模板呢?
範本是一個文本,用於分離文檔的表現形式和內容。 範本定義了佔位符以及各種用於規範文件該如何顯示的各部分基本邏輯(範本標籤)。 模板通常用於產生HTML,但是Django的模板也能產生任何基於文字格式的文件。下面我們從一個簡單的例子來學習下什麼是模板。 (這個例子源自DjangoBook2)
<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>
如上所示用{{=}.像第一個{{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或其他什麼負數索引。
好好觀察上面三段程式碼,是不是就舉一反三了呢?另外預設情況下,如果一個變數不存在,模板系統會把它展示為空字串,不做任何事情來表示失敗。