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

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


爲了減小模板加載調用過程及模板自己的冗餘代碼,Django 提供了一種使用方便且功能強大的 API ,用於從磁盤中加載模板,

要使用此模板加載API,首先你必須將模板的保存位置告訴框架。 設置的保存文件就是settings.py。

若是你是一步步跟隨咱們學習過來的,立刻打開你的settings.py配置文件,找到TEMPLATE_DIRS這項設置吧。 它的默認設置是一個空元組(tuple),加上一些自動生成的註釋。

html

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 中:

python

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



下面是一些注意事項:

你能夠任意指定想要的目錄,只要運行 Web 服務器的用戶能夠讀取該目錄的子目錄和模板文件。 若是實在想不出合適的位置來放置模板,咱們建議在 Django 項目中建立一個 templates 目錄。

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

Bad:

django

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


Good:

windows

# 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後綴沒有直接的聯繫。 你能夠選擇任意後綴的任意文件,只要是符合邏輯的都行。甚至選擇沒有後綴的文件也不會有問題。

要肯定某個模板文件在你的系統裏的位置, 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 錯誤。參考來源: http://www.aichengxu.com/view/60780函數

 

Screenshot of a TemplateDoesNotExist error.



該頁面與咱們在第三章解釋過的錯誤頁面類似,只不過多了一塊調試信息區: 模板加載器過後檢查區。 該區域顯示 Django 要加載哪一個模板、每次嘗試出錯的緣由(如:文件不存在等)。 當你嘗試調試模板加載錯誤時,這些信息會很是有幫助。

接下來,在模板目錄中建立包括如下模板代碼 current_datetime.html 文件:

學習

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



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

編碼


更多Python教程》》http://www.aichengxu.com/item/15

相關文章
相關標籤/搜索