最近我一直在使用 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
,这当然不存在。经过研究,我发现一篇文章说阻止相对路径是出于安全目的,但它让我无法访问当前工作目录之外的任何文件。
我认为这在构建网站时必须是一种非常常见的设置,因此必须有某种方式与我还不知道的多个模板进行交互。如果有人对此有任何信息,我们将不胜感激。
最佳答案
您的 base.html
应该位于 templates
目录中,而不是 static
目录中。
这是因为您使用 settings.py
文件中的 TEMPLATE_DIRS
定义了 django 在何处搜索模板。在这里,我给出了一个动态计算您的 TEMPLATE_DIRS
值的示例。
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), '..', 'templates'),
)
此外,您需要注意 django 依赖于另一个名为 TEMPLATE_LOADERS
的设置
来确定它在搜索时加载 html 文件/模板的优先级通过您的 templates
目录。
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" %}
你会正确地扩展
关于html - 在 Django 模板中使用绝对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13522120/