在django模板中使用绝对路径

时间:2012-11-23 01:32:35

标签: html django

最近我一直在使用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,当然,这不存在。在研究之后,我看到一篇文章说阻止相对路径是为了安全目的而故意,但它让我无法访问当前工作目录之外的任何文件。

我认为在构建网站时这必须是一个非常常见的设置,因此必须有某种方式与多个模板交互,我还没有意识到。如果有人有任何相关信息,我将不胜感激。

2 个答案:

答案 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标记从其他模板继承时,您提供的路径始终相对于模板目录,而不是项目。