2012-04-30 87 views
6

我有我的Django應用程序模板的以下文件夾結構:告訴Django搜索應用程序的模板子文件夾

templates/ 
    app/ 
     model1/ 
     model1_form.html 
     model2/ 
     model2_form.html 

假設我使用MODEL1和通用的ListView,現在它僅搜索在模板/應用程序/ model1_form.html。無論如何,我可以告訴Django他也應該搜索應用程序/子文件夾?我不想手動設置模板名稱和路徑(template_name="templates/app/model1/model1_form.html")。

在settings.py我:

import os.path 
BASE_PATH = os.path.dirname(os.path.dirname(__file__)) 
TEMPLATE_DIRS = (
    BASE_PATH+'/templates/', 
) 

這是我的看法:

class HousesListView(ListView): 
    model = House 
    context_object_name = "house_list" 

提前感謝!

回答

19

您需要將django.template.loaders.app_directories.Loader添加到TEMPLATE_LOADERS(如果它尚未)。

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
) 

然後,更改你的文件夾結構,使得你在應用程序目錄下的「模板」文件夾:

- <project_root> 
    - app 
     - templates 
      - model1 
      - model2 

或者正確命名空間中的模型,使他們不與其他應用程序名衝突小心:

- <project_root> 
    - app 
     - templates 
      - app 
       - model1 
       - model2 
+3

檢查Bob Vork對Django的答案1.8+ – horriblyUnpythonic

1

我認爲使用從子文件夾中的模板通常你要麼必須:

  1. 手動給模板路徑爲subdir/template.html
    如。選擇render_to_response( '子/目錄/ template.html')或TEMPLATE_NAME = '...'

  2. 定義在TEMPLATE_DIRS
    例如所有子文件夾。

    TEMPLATE_DIRS =(
    BASE_PATH + '/模板/',
    BASE_PATH + '/模板/應用',
    BASE_PATH + '/模板/應用/ MODEL1',

    但是因爲除了通用視圖要在app_name/template.html, 中找到模板,您將不得不移動模板以將/path/to/templates/app/model1添加到TEMPLATE_DIRS,並將模板移至templates/your_app/model/your_app/model_template.html,這有些尷尬。

+0

我嘗試了第2號,將「templates/app/model1」放在TEMPLATE_DIR,但這使得Django搜索在「templates/app/model1/app/model1_form.html」。你對數字1有什麼意義? – Clash

+0

@Clash你給絕對路徑,還是相對於你的「templates-root」?通過1.我的意思是用完整的路徑調用模板,你不想這麼做? – varesa

+0

你是什麼意思使用「模型/ template.html」? – Clash

18

其他的答案在當時是正確的,但現在任何人都碰到這個來了,這是怎麼了,這是在Django 1.8+

完成

默認情況下,Django現在在應用程序文件夾中查找模板。這是由'APP_DIRS': True,TEMPLATES設置來表示這樣的:

TEMPLATES = [ 
    { 
    ... 
    'DIRS': ['templates'], 
    'APP_DIRS': True, 
    ... 
    }, 
] 

至於其他的答案表明,你還是應該用appname/templates/appname/model1_form.html來命名空間中的模板

(詳細信息:在標題爲https://docs.djangoproject.com/en/1.8/intro/tutorial03/#write-views-that-actually-do-something「模板命名空間')

最終檢查:確保您使用的應用程序位於INSTALLED_APPS元組中,因爲這是我遇到的問題。

+0

幹得好。 「確保你使用的應用程序在INSTALLED_APPS元組中」 – Private

0

使用Django 2.0,甚至不需要更改settings.py中的TEMPLATES變量中的任何內容。 唯一的要求是將appname.apps.AppnameConfig(例如catalog.apps.CatalogConfig爲名爲'catalog'的應用程序)添加到INSTALLED_APPS列表中,然後django在搜索模板時將查找appname/templates下的內容。

相關問題