一般說來,你會把模板以檔案的方式儲存在檔案系統中,但是你也可以使用自訂的 template loaders 從其他來源載入模板。
Django有兩種方法載入模板
- django.template.loader.get_template(template_name) : get_template 根據給定的模板名稱返回一個已編譯的模板(一個 Template 對象)。 如果模板不存在,就觸發 TemplateDoesNotExist 的異常。
- django.template.loader.select_template(template_name_list) : select_template 很像 get_template ,不過它是以模板名稱的列表作為參數的。 它會返回列表中存在的第一個模板。 如果模板都不存在,將會觸發TemplateDoesNotExist異常。
預設情況下這些函數使用 TEMPLATE_DIRS 的設定來載入模板。 但是,在內部這些函數可以指定一個模板載入器來完成這些繁重的任務。
一些載入器預設被禁用,但是你可以通過編輯 TEMPLATE_LOADERS 設定來啟用它們。 TEMPLATE_LOADERS 應當是一個字串的元組,其中每個字串都表示一個模板載入器。 這些模板載入器隨Django一起發布。
django.template.loaders.filesystem.load_template_source : 這個載入器根據 TEMPLATE_DIRS 的設定從檔案系統載入模板。它預設是可用的。
django.template.loaders.app_directories.load_template_source : 這個加 載器從檔案系統上的Django應用中載入模板。 對 INSTALLED_APPS 中的每個應用,這個載入器會尋找templates 子目錄。 如果這個目錄存在,Django就在那裡尋找模板。
這意味著你可以把模板和你的應用一起儲存,從而使得Django應用更容易和預設範本一起發布。 例如,如果 INSTALLED_APPS 包含 ('myproject.polls','myproject.music') ,那麼 get_template('foo.html') 會按這個順序尋找模板:
/path/to/myproject/polls/templates/foo.html /path/to/myproject/music/templates/foo.html
請注意載入器在首次被匯入的時候會執行一個最佳化: 它會緩衝一個列表,這個列表包含了 INSTALLED_APPS 中帶有 templates 子目錄的包。
這個載入器預設啟用。
django.template.loaders.eggs.load_template_source : 這個載入器類似 app_directories ,只不過它從Python eggs而不是檔案系統中載入模板。 這個載入器預設被禁用;如果你使用eggs來發布你的應用,那麼你就需要啟用它。 Python eggs可以將Python代碼壓縮到一個檔案中。
Django按照 TEMPLATE_LOADERS 設定中的順序使用模板載入器。 它逐個使用每個載入器直至找到一個匹配的模板。