1. 程式人生 > >在Python的Django框架中載入模版的方法

在Python的Django框架中載入模版的方法


為了減少模板載入呼叫過程及模板本身的冗餘程式碼,Django 提供了一種使用方便且功能強大的 API ,用於從磁碟中載入模板,

要使用此模板載入API,首先你必須將模板的儲存位置告訴框架。 設定的儲存檔案就是settings.py。

如果你是一步步跟隨我們學習過來的,馬上開啟你的settings.py配置檔案,找到TEMPLATE_DIRS這項設定吧。 它的預設設定是一個空元組(tuple),加上一些自動生成的註釋。

TEMPLATE_DIRS = (
 # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
 # Always use forward slashes, even on Windows.
 # Don't forget to use absolute paths, not relative paths.
)


該設定告訴 Django 的模板載入機制在哪裡查詢模板。 選擇一個目錄用於存放模板並將其新增到 TEMPLATE_DIRS 中:

TEMPLATE_DIRS = (
 '/home/django/mysite/templates',
)


下面是一些注意事項:

你可以任意指定想要的目錄,只要執行 Web 伺服器的使用者可以讀取該目錄的子目錄和模板檔案。 如果實在想不出合適的位置來放置模板,我們建議在 Django 專案中建立一個 templates 目錄。

如果你的 TEMPLATE_DIRS只包含一個目錄,別忘了在該目錄後加上個逗號。 

Bad:

# Missing comma!
TEMPLATE_DIRS = (
 '/home/django/mysite/templates'
)

Good:

# Comma correctly in place.
TEMPLATE_DIRS = (
 '/home/django/mysite/templates',
)


Python 要求單元素元組中必須使用逗號,以此消除與圓括號表示式之間的歧義。 這是新手常犯的錯誤。

如果使用的是 Windows 平臺,請包含驅動器符號並使用Unix風格的斜槓(/)而不是反斜槓(),就像下面這樣:

TEMPLATE_DIRS = (
 'C:/www/django/templates',
)


最省事的方式是使用絕對路徑(即從檔案系統根目錄開始的目錄路徑)。 如果想要更靈活一點並減少一些負面干擾,可利用 Django 配置檔案就是 Python 程式碼這一點來動態構建 TEMPLATE_DIRS 的內容,如: 例如:

import os.path

TEMPLATE_DIRS = (
 os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)


這個例子使用了神奇的 Python 內部變數 __file__ ,該變數被自動設定為程式碼所在的 Python 模組檔名。 `` os.path.dirname(__file__)`` 將會獲取自身所在的檔案,即settings.py 所在的目錄,然後由os.path.join 這個方法將這目錄與 templates 進行連線。如果在windows下,它會智慧地選擇正確的後向斜槓”“進行連線,而不是前向斜槓”/”。

在這裡我們面對的是動態語言python程式碼,我需要提醒你的是,不要在你的設定檔案裡寫入錯誤的程式碼,這很重要。 如果你在這裡引入了語法錯誤,或執行錯誤,你的Django-powered站點將很可能就要被崩潰掉。

完成 TEMPLATE_DIRS 設定後,下一步就是修改檢視程式碼,讓它使用 Django 模板載入功能而不是對模板路徑硬編碼。 返回 current_datetime 檢視,進行如下修改:

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
 now = datetime.datetime.now()
 t = get_template('current_datetime.html')
 html = t.render(Context({'current_date': now}))
 return HttpResponse(html)


此範例中,我們使用了函式 django.template.loader.get_template() ,而不是手動從檔案系統載入模板。 該 get_template() 函式以模板名稱為引數,在檔案系統中找出模組的位置,開啟檔案並返回一個編譯好的 Template 物件。

在這個例子裡,我們選擇的模板檔案是current_datetime.html,但這個與.html字尾沒有直接的聯絡。 你可以選擇任意字尾的任意檔案,只要是符合邏輯的都行。甚至選擇沒有後綴的檔案也不會有問題(參考:http://www.aichengxu.com/view/60780)。

要確定某個模板檔案在你的系統裡的位置, get_template()方法會自動為你連線已經設定的 TEMPLATE_DIRS目錄和你傳入該法的模板名稱引數。比如,你的 TEMPLATE_DIRS目錄設定為 '/home/django/mysite/templates',上面的 get_template()呼叫就會為你找到 /home/django/mysite/templates/current_datetime.html 這樣一個位置。

如果 get_template() 找不到給定名稱的模板,將會引發一個 TemplateDoesNotExist 異常。 要了解究竟會發生什麼,讓我們按照第三章內容,在 Django 專案目錄中執行 python manage.py runserver 命令,再次啟動Django開發伺服器。 接著,告訴你的瀏覽器,使其定位到指定頁面以啟用current_datetime檢視(如 http://127.0.0.1:8000/time/ )。假設你的 DEBUG項設定為 True,而你有沒有建立current_datetime.html 這個模板檔案,你會看到Django的錯誤提示網頁,告訴你發生了 TemplateDoesNotExist 錯誤。

Screenshot of a TemplateDoesNotExist error.


該頁面與我們在第三章解釋過的錯誤頁面相似,只不過多了一塊除錯資訊區: 模板載入器事後檢查區。 該區域顯示 Django 要載入哪個模板、每次嘗試出錯的原因(如:檔案不存在等)。 當你嘗試除錯模板載入錯誤時,這些資訊會非常有幫助。

接下來,在模板目錄中建立包括以下模板程式碼 current_datetime.html 檔案:

<html><body>It is now {{ current_date }}.</body></html>


在網頁瀏覽器中重新整理該頁,你將會看到完整解析後的頁面。