2

我有一个包含一堆 html 文件和图像的静态目录。所有 html 文件都包含使用相对路径的相互链接。例如,描述算法的页面有一个链接,例如<a href ../../newmethod/algo2.html>Algorithm 2</a>. 此目录中的所有内容都可以在任何静态服务器中以可移植的方式很好地工作。

我想用 django 给这个目录下的每个 html 文件添加一个页面横幅。无论如何使用包含横幅代码并使用“ssi”指令包含静态htmls文件的模板来实现这一点?

我找不到解决方案的问题是静态 html 中的相对路径。当我使用 ssi 在模板中包含静态 html 时,相对路径(例如 html 文件中的图像路径)变得完全错误。例如<img src='../images/flow.bmp>,静态 html 中的图像不再指向图像的正确地址。

无论如何在 django 中纠正这个相对 url 问题?

4

2 回答 2

0

与 Web 服务器相比,在静态环境中访问文件的区别在于目录根目录和 Web 服务器根文件系统可能不同。您可以为此调整相对路径。

此外,作为一个框架,django 期望 html 模板驻留templates在您的应用程序内或project/templates/app/级别内。像图像这样的静态资产应该按照这里的描述进行管理。用户上传的媒体应作为媒体文件处理

然后在您的模板中使用{{STATIC_URL}}{{MEDIA_URL}}在适当的地方使用。

因此,在这种情况下,您../../newmethod/algo2.html应该位于从当前模板通过目录中的“cd ../../newmethod”访问的templates目录中

于 2012-10-30T06:16:51.467 回答
0

可以添加一个 HTML<base>元素来更改所有链接所指的内容:

<base href="{% get_static_prefix %}{{ request.path }}"/>

这将意味着浏览器将链接解释为好像文件是从而/static/path/to/file.html不是/path/to/file.html. 不过,我发现这使得链接其他静态 html 文件变得更加复杂,因为它们随后被直接链接到。

相反,您可以只为其他 URL 提供重定向,以便它们在相对于通过模板提供的 HTML 的位置上注册(在我的情况下,我希望/static/projects通过模板提供其中和下面的所有 html 文件projects_frame.html)。在urls.py

# Handle projects by serving static files in a frame; redirect indexes
url("^projects/(?P<path>[^./]+)/$", RedirectView.as_view(url="/projects/%(path)s/index.html")),
url("^projects/[^/]+/.*[.]html$", direct_to_template, {"template": "projects_frame.html", "extra_context": {"STATIC_FILES_ROOT": settings.STATIC_FILES_ROOT}}, name="projects"),
url("^projects/(?P<path>[^/]+/.*[.].*)$", RedirectView.as_view(url="/static/projects/%(path)s")),

然后我的模板看起来像这样(我使用的是夹层,所以这不是普遍适用的,但应该给出一个想法):

{% extends "base.html" %}
{% load i18n staticfiles %}

{% block meta_title %}{% trans "Home" %}{% endblock %}
{% block title %}{% trans "Home" %}{% endblock %}

{% block breadcrumb_menu %}
<li class="active">{% trans "Home" %}</li>
{% endblock %}

{% block body %}
{% ssi STATIC_FILES_ROOT|add:request.path %}
{% endblock %}

PSSTATIC_FILES_ROOT是我定义的自定义变量,因为我遇到了一个问题STATIC_ROOT

于 2013-11-04T07:28:23.307 回答