2017-01-13 210 views
0

我有一个base.html模板,我网站上的每一个页面都会扩展。但是,从我收集的信息来看,Django要求模板应该位于app目录中。从应用程序中,如何扩展我在项目的基本目录/ templates /中找到的模板?Django模板结构问题

这里是我的目录排序方式:

project/ 
|----templates/ 
| |----base.html 
| 
|----app1/ 
| |----templates/ 
|   |----app1/ 
|    |----base.html 
|    |----index.html 
| 
|----app2/... 

目前,我的index.html扩展APP1/base.html文件:

{% extends 'welcome/base.html' %} 

然而,这是不理想的,因为我想扩展project/templates/base.html。从逻辑上讲,我的app1不应该有一个模板。

Settings.py:

TEMPLATE_DIRS = (
    # Don't forget to use absolute paths, not relative paths. 
    os.path.join(PROJECT_ROOT, 'templates').replace('\\', '/'), 
) 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

错误是,当我APP1/views.py试图渲染:

{% extends 'welcome/base.html' %} 

回答

1

你可以只使用{% extends 'base.html' %}。所有模板目录都有相同的名称空间。基模板的模板目录无关紧要,唯一重要的是它与模板目录的相对路径。

这也是为什么您应该为应用程序特定模板使用前缀。如果你没有,并且同时有project/templates/base.htmlapp1/templates/base.html,Django会将它们视为同一个文件,并且一个覆盖另一个文件。

TEMPLATE_DIRS设置已弃用,有利于TEMPLATES,如果设置了后者,则忽略TEMPLATE_DIRS。您应该将目录添加到'DIRS'代替:

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [os.path.join(PROJECT_ROOT, 'templates')], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 
+0

这是我想的第一件事,我得到了同样的错误“TemplateDoesNotExist在/”。 – user3750325

+0

@ user3750325然后,您应该显示错误和您的模板设置。 – knbk

+0

我更新了我的问题以显示settings.py和错误! – user3750325