注明:python版本為3.3.1、Django版本為1.5.1,操作系統為Windows7,其他版本有一些不同的地方讀者可以自行探討。
在上一章你可能已經發現了這樣的問題,就是在視圖返回文本的時候,HTML代碼被硬編碼在了python的代碼中。如%s等等。像這樣寫往往使得程序更加復雜,一旦修改起來又顯得十分的麻煩,而且HTML代碼程序員不見得會python代碼,現在的開發一般都會使得HTML前台頁面和Python后台分離,也就是前台只負責顯示頁面,后台只負責處理數據和其他操作。因此,模板顯得尤為重要。
那么,什么是模板呢?
模板是一個文本,用於分離文檔的表現形式和內容。 模板定義了占位符以及各種用於規范文檔該如何顯示的各部分基本邏輯(模板標簽)。 模板通常用於產生HTML,但是Django的模板也能產生任何基於文本格式的文檔。下面我們從一個簡單的例子來學習下什么是模板。(這個例子源自DjangoBook2)
1 <html> 2 <head><title>Ordering notice</title></head> 3 <body> 4 <h1>Ordering notice</h1> 5 <p>Dear {{ person_name }},</p> 6 <p>Thanks for placing an order from {{ company }}. It's scheduled to 7 ship on {{ ship_date|date:"F j, Y" }}.</p> 8 <p>Here are the items you've ordered:</p> 9 <ul> 10 {% for item in item_list %} 11 <li>{{ item }}</li> 12 {% endfor %} 13 </ul> 14 {% if ordered_warranty %} 15 <p>Your warranty information will be included in the packaging.</p> 16 {% else %} 17 <p>You didn't order a warranty, so you're on your own when 18 the products inevitably stop working.</p> 19 {% endif %} 20 <p>Sincerely,<br />{{ company }}</p> 21 </body> 22 </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或者其他什么負數索引。
好好觀察上面三段代碼,是不是就舉一反三了呢?另外默認情況下,如果一個變量不存在,模板系統會把它展示為空字符串,不做任何事情來表示失敗。
至於標簽和過濾器以及模板在視圖中的應用我們將這這一章的續集來講述。今天就到這吧。
本人既是python的初學者也是Django的初學者,寫這一系列教程的目的就是為了加深自己的理解,希望大家多多包涵和指教,有什么問題請留言,謝謝。