3

最近我一直在 Django 中开发一个使用站点范围的 CSS 布局的项目,所以我决定使用的每个模板(在本例中为 /projects/index.html 中的模板)都将扩展一个包含标题的基本文件,页脚、javascript 等称为base.html.

问题是我的目录结构如下所示:

.
├── static
│   └── base.html
├── templates
│   └── projects
│   └── index.html

而且,如您所见,我要扩展的基本文件位于比 index.html 文件更高的目录中。通常,我会使用相对路径并在索引文件的顶部使用以下代码:{% extends "../base.html" %}或者只是使用文件的绝对路径(如有必要)

然而,似乎通过使用这两种方法中的任何一种,extends 引号内的任何内容都会简单地附加到当前路径上,而我使用 .. 对上层目录的调用被完全忽略。

也就是说,如果当前路径是,例如,/project/templates/projects并且我使用{% extends "/project/static/base.html" %},那将被附加到当前路径,导致系统寻找/project/templates/projects/project/static/base.html,当然,它不存在。在研究之后,我看到一篇文章说,为了安全目的,阻止相对路径是故意的,但它让我无法访问当前工作目录之外的任何文件。

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

4

2 回答 2

2

base.html应该驻留在templates目录中而不是static目录中。

TEMPLATE_DIRS这是因为您定义了 django 使用文件中的 搜索模板的位置settings.py。在这里,我举了一个TEMPLATE_DIRS动态计算你的价值的例子。

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), '..', 'templates'),
)

此外,您需要知道 django 依赖于另一个setting调用TEMPLATE_LOADERS来确定它在搜索templates目录时加载 html 文件/模板的优先级。

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
    # 'django.template.loaders.eggs.Loader',
)

一旦你base.html位于你的templates目录中,你需要在你的 html 文件中做的就是写: -

{% extends "base.html" %}

你会正确扩展

于 2012-11-23T01:37:22.907 回答
1

您的所有 html 模板都应位于该templates目录下(包括您的 base.html)。此文件夹的位置是使用TEMPLATE_DIRECTORY您的settings.py. 该static文件夹仅用于 css、js 等。

当使用标签从另一个模板继承时extends,你给出的路径总是相对于你的模板目录,而不是项目。

于 2012-11-23T01:37:31.560 回答