最近我一直在使用Django的一个项目,它使用一个站点范围的CSS布局,所以我决定使用的每个模板(在本例中是/projects/index.html中的模板)将扩展一个包含的基本文件标题,页脚,javascript等称为base.html
。
问题是我的目录结构如下:
.
├── static
│ └── base.html
├── templates
│ └── projects
│ └── index.html
而且,正如您所看到的,我想要扩展的基本文件位于比index.html文件更高的目录中。通常,我会使用相对路径并在索引文件的顶部使用以下代码:{% extends "../base.html" %}
或只使用文件的绝对路径(如果需要)
然而,似乎通过使用这些方法中的任何一个,扩展的引号内的任何内容都会被附加到当前路径上,并且我对...的上层目录的调用将被完全忽略。
也就是说,如果当前路径是/project/templates/projects
而我使用{% extends "/project/static/base.html" %}
,则会将其附加到当前路径,从而导致系统查找/project/templates/projects/project/static/base.html
,当然,这不存在。在研究之后,我看到一篇文章说阻止相对路径是为了安全目的而故意,但它让我无法访问当前工作目录之外的任何文件。
我认为在构建网站时这必须是一个非常常见的设置,因此必须有某种方式与多个模板交互,我还没有意识到。如果有人有任何相关信息,我将不胜感激。
答案 0 :(得分:1)
您的base.html
应该位于templates
目录中,而不是static
目录中。
这是因为您使用TEMPLATE_DIRS
文件中的settings.py
来定义django搜索模板的位置。在这里,我举一个动态计算TEMPLATE_DIRS
值的例子。
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), '..', 'templates'),
)
此外,您需要注意django依赖另一个名为setting
的{{1}}来确定加载您的html文件/模板的优先级,同时搜索您的TEMPLATE_LOADERS
目录。
templates
一旦TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
位于base.html
目录中,您在html文件中需要做的就是写: -
templates
你会正确延伸
答案 1 :(得分:0)
您的所有html模板都应位于templates
目录下(包括您的base.html)。使用settings.py
中的TEMPLATE_DIRECTORY
设置设置此文件夹的位置。 static
文件夹仅适用于css,js等。
使用extends
标记从其他模板继承时,您提供的路径始终相对于模板目录,而不是项目。