我的django应用程序上的模板有以下文件夹结构:
templates/
app/
model1/
model1_form.html
model2/
model2_form.html
假设我使用的是model1和一个通用ListView,现在它只搜索templates / app / model1_form.html。无论如何我可以告诉django他还应该搜索app /子文件夹吗?我不想手动设置模板名称和路径(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"
提前致谢!
答案 0 :(得分:21)
其他答案在当时是正确的,但对于现在遇到此问题的任何人来说,这就是在Django 1.8 +中完成的方法
默认情况下,Django现在在app文件夹中查找模板。这由'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在标题为'template namespacing'的框中)
最终检查:确保您使用的应用程序位于INSTALLED_APPS
元组中,因为这是我遇到的问题。
答案 1 :(得分:20)
您需要将django.template.loaders.app_directories.Loader
添加到TEMPLATE_LOADERS
(如果尚未添加)。
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
然后,更改您的文件夹结构,以便在app目录中有一个“templates”文件夹:
- <project_root>
- app
- templates
- model1
- model2
或者正确命名模型,以便它们不会意外地与其他应用名称冲突:
- <project_root>
- app
- templates
- app
- model1
- model2
答案 2 :(得分:1)
我认为通常你需要使用子文件夹中的模板:
手动将模板路径设为subdir/template.html
例如。 render_to_response('sub / dir / template.html')或template_name ='...'
定义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
,这有点尴尬。
答案 3 :(得分:0)
使用Django 2.0,甚至不需要更改TEMPLATES
中settings.py
变量中的任何内容。
唯一的要求是将appname.apps.AppnameConfig
(例如 catalog.apps.CatalogConfig 添加到名为&#39;目录&#39;的应用程序)到INSTALLED_APPS
列表,然后django将在搜索模板时查看appname / templates下的内容。