告诉django搜索应用程序的模板子文件夹

Cla*_*ash 6 django django-templates

我的django应用程序上的模板有以下文件夹结构:

templates/
   app/
      model1/
         model1_form.html
      model2/ 
         model2_form.html
Run Code Online (Sandbox Code Playgroud)

假设我使用的是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/',
)
Run Code Online (Sandbox Code Playgroud)

这是我的看法:

class HousesListView(ListView):
    model = House
    context_object_name = "house_list"
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Bob*_*ork 22

其他答案在当时是正确的,但对于现在遇到这种情况的人来说,这就是Django 1.8+的完成方式

默认情况下,Django现在在app文件夹中查找模板.这'APP_DIRS': True,在以下TEMPLATES设置中表示:

TEMPLATES = [
  {
    ...
    'DIRS': ['templates'],
    'APP_DIRS': True,
    ...
  },
]
Run Code Online (Sandbox Code Playgroud)

正如其他答案所示,您仍应使用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元组中,因为这是我遇到的问题.


Chr*_*att 20

您需要添加django.template.loaders.app_directories.LoaderTEMPLATE_LOADERS(如果不是的话).

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)
Run Code Online (Sandbox Code Playgroud)

然后,更改您的文件夹结构,以便在app目录中有一个"templates"文件夹:

- <project_root>
    - app
        - templates
            - model1
            - model2
Run Code Online (Sandbox Code Playgroud)

或者正确地命名模型,以便它们不会意外地与其他应用程序名称冲突:

- <project_root>
    - app
        - templates
            - app
                - model1
                - model2
Run Code Online (Sandbox Code Playgroud)

  • 查看Bob Vork对Django 1.8+的回答 (3认同)