7

我的 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"

提前致谢!

4

4 回答 4

26

当时其他答案是正确的,但是对于现在遇到这个问题的任何人来说,这就是在 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元组中,因为这是我遇到的问题。

于 2015-09-29T10:01:44.457 回答
22

您需要添加django.template.loaders.app_directories.LoaderTEMPLATE_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
于 2012-04-30T16:55:13.707 回答
1

我认为要使用子文件夹中的模板,通常您必须:

  1. 手动给出模板路径,subdir/template.html
    例如。render_to_response('sub/dir/template.html') 或 template_name='...'

  2. TEMPLATE_DIRS
    在例如 定义所有子文件夹。

    TEMPLATE_DIRS = (
    BASE_PATH+'/templates/',
    BASE_PATH+'/templates/app',
    BASE_PATH+'/templates/app/model1',
    )

    但是因为除了模板之外的通用视图可以在 app_name/template.html 中找到,您必须移动模板以添加/path/to/templates/app/model1到 TEMPLATE_DIRS,并将模板移动到templates/your_app/model/your_app/model_template.html,这有点尴尬。

于 2012-04-30T15:33:10.030 回答
0

使用 Django 2.0,甚至不需要TEMPLATES更改settings.py. 唯一的要求是将appname.apps.AppnameConfig(例如catalog.apps.CatalogConfig用于名为'catalog' 的应用程序)添加到INSTALLED_APPS列表中,然后django 在搜索模板时将在appname/templates 下查找。

于 2018-01-16T08:42:40.130 回答