html - 在 Django 模板中使用绝对路径

标签 html django

最近我一直在使用 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/

相关文章:

c# - 获取 HTML 文本字段并在 C# (cshtml) 中用作变量

mysql - 南迁移错误,InnoDB : ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope

Django 在发布请求后下载 csv

jquery,如何使用 jquery 添加 HTML 十六进制图标类?

html - 当涉及边距时,如何确定 <svg> 的宽度?

html - 如何使列从容器顶部开始,而不依赖于其他列?

javascript - 使用 JavaScript 修改 DOM 元素属性

django - 按对象的 date_created 属性对来自不同模型的查询集对象列表进行排序

Python 错误 : The view form. formapp.views.contact 未返回 HttpResponse 对象。解决

python - 在 Google AppEngine 中将数据导出为 XML 文件