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

时间:2012-04-30 15:28:39

标签: django django-templates

我的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 个答案:

答案 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)

我认为通常你需要使用子文件夹中的模板:

  1. 手动将模板路径设为subdir/template.html
    例如。 render_to_response('sub / dir / 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,这有点尴尬。

答案 3 :(得分:0)

使用Django 2.0,甚至不需要更改TEMPLATESsettings.py变量中的任何内容。 唯一的要求是将appname.apps.AppnameConfig(例如 catalog.apps.CatalogConfig 添加到名为&#39;目录&#39;的应用程序)到INSTALLED_APPS列表,然后django将在搜索模板时查看appname / templates下的内容。