django 模板的載入和匯入

2021-07-11 06:39:47 字數 4949 閱讀 9796

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

要使用此模板載入api,首先你必須將模板的儲存位置告訴框架。該項工作在 設定檔案 中完成。

django 設定檔案是存放 django 例項(也就是 django 專案)配置的地方。它是乙個簡單的 python 模組,其中包含了一些模組級變數,每個都是一項設定。

第二章中執行 django-admin.py

startproject

mysite

命令時,它為你建立了乙個的預設配置檔案,並恰如其分地將其名為settings.py 。檢視一下該檔案內容。其中包含如下變數(但並不一定是這個順序):

debug = true

time_zone = 'america/chicago'

use_i18n = true

root_urlconf = 'mysite.urls'

這裡無需更多詮釋;設定項與值均為簡單的 python 變數。同時由於配置檔案只不過是純 python 模組,你可以完成一些動態工作,比如在設定某變數之前檢查另一變數的值。(這也意味著你必須避免配置檔案出現 python 語法錯誤。)

我們將在附錄 e 中詳述配置檔案,目前而言,僅需關注 template_dirs 設定。該設定告訴 django 的模板載入機制在**查詢模板。預設情況下,該設定的值是乙個空的元組。選擇乙個目錄用於存放模板並將其新增到 template_dirs 中:

template_dirs = (

'/home/django/mysite/templates',)

下面是一些注意事項:

你可以任意指定想要的目錄,只要執行 web 伺服器的使用者賬號可以讀取該目錄的子目錄和模板檔案。如果實在想不出合適的位置來放置模板,我們建議在 django 專案中建立乙個 templates 目錄(也就是說,如果你一直都按本書的範例操作的話,在第二章建立的 mysite 目錄中)。

不要忘記模板目錄字串尾部的逗號!python 要求單元素元組中必須使用逗號,以此消除與圓括號表示式之間的歧義。這是新手常犯的錯誤。

想避免此錯誤的話,你可以將列表而不是元組用作 template_dirs ,因為單元素列表並不強制要求以逗號收尾:

template_dirs = [

'/home/django/mysite/templates']

從語義上看,元組比列表略顯合適(元組在建立之後就不能修改,而配置被讀取以後就不應該有任何修改)。因此,我們推薦對 template_dirs 設定使用元組。

如果使用的是 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 模組檔名。

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

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

template()是templste類的乙個例項:可以接收原版的模板**為引數,也可以接收賦值為模板原始**的變數!

函式以模板名稱為引數,在檔案系統中找出模組的位置,開啟檔案並返回乙個編譯好的 

template

物件:

由於載入模板、填充 context

、將經解析的模板結果返回為 httpresponse

物件這一系列操作實在太常用了,django 提供了一條僅用一行**就完成所有這些工作的捷徑。該捷徑就是位於 django.shortcuts

模組中名為 render_to_response()

的函式。大多數時候,你將使用 render_to_response()

,而不是手動載入模板、建立 context

和 httpresponse

物件。下面就是使用 render_to_response()

重新編寫過的 current_datetime

範例。

from django.shortcuts import render_to_response

import datetime

def current_datetime(request):

now = datetime.datetime.now()

return render_to_response('current_datetime.html', )

大變樣了!讓我們逐句看看**發生的變化:

render_to_response()

的第乙個引數必須是要使用的模板名稱。如果要給定第二個引數,那麼該引數必須是為該模板建立context

時所使用的字典。如果不提供第二個引數, render_to_response()

使用乙個空字典。

locals() 技巧

思考一下我們對 current_datetime

的最後一次賦值:

def current_datetime(request):

now = datetime.datetime.now()

return render_to_response('current_datetime.html', )

很多時候,就像在這個範例中那樣,你發現自己一直在計算某個變數,儲存結果到變數中(比如:前面**中的 now

),然後將這些變數傳送給模板。特別懶的程式設計師可能注意到給這些臨時變數 和 模板變數命名顯得有點多餘。不但多餘,而且還要進行額外的鍵盤輸入。

。它返回的字典對所有區域性變數的名稱與值進行對映。因此,前面的檢視可以重寫成下面這個樣子:

def current_datetime(request):

current_date = datetime.datetime.now()

return render_to_response('current_datetime.html', locals())

在此,我們沒有像之前那樣手工指定 context 字典,而是傳入了 locals()

的值,它囊括了函式執行到該時間點時所定義的一切變數。因此,我們將 now

變數重新命名為 current_date

,因為那才是模板所預期的變數名稱。在本例中, locals()

並沒有帶來多大 的改進,但是如果有多個模板變數要界定而你又想偷懶,這種技術可以減少一些鍵盤輸入。

使用 locals()

時要注意是它將包括 所有 的區域性變數,組成它的變數可能比你想讓模板訪問的要多。在前例中, locals()

還包含了 request

。對此如何取捨取決你的應用程式。

最後要考慮的是在你呼叫 locals()

時,python 必須得動態建立字典,因此它會帶來一點額外的開銷。如果手動指定 context 字典,則可以避免這種開銷。

Django模板的繼承與模板的匯入

目錄二 模板的繼承使用 三 模版的匯入 一 模版的繼承 1.什麼是模板繼承?你需要事先在你想要使用的主頁面上劃定區域做好標記,之後在子頁面繼承的時候你就可以使用在主頁面劃定的區域,也就意味著,如果你不劃定任何區域,那麼你子頁面將無法修改主頁面內容2.使用繼承流程原理 你們有沒有見過一些 這些 頁面整...

Django 模板載入靜態檔案

2 確保在 settings.py中設定了static url。staticfiles dirs os.path.join base dir,static 5 在模版中使用 load 標籤載入 static 標籤。比如要載入在專案的 static 資料夾下的 style.css 的檔案。那麼示例 如...

模板多個列表級聯 Django模板載入與響應

在前文章節 django模板系統 中,我們對 django 的模板系統有了初步的認識,在本章我們將重點講解 django 的模板語言。djano 的模板系統將 python 與 html 解耦,動態地生成 html 頁面。django 專案可以配置乙個或多個模板引擎,但是通常使用 django 的模...