管理django的静态html文件中的相对URL

时间:2012-10-30 05:38:42

标签: django django-templates

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

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

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

有没有在django中纠正这个相对网址问题?

2 个答案:

答案 0 :(得分:0)

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

此外,作为框架,django希望html模板位于templates内,位于您的应用内或project/templates/app/级别。像图像这样的静态资产应该按照here所述进行管理。用户上传的媒体应该被处理为media files

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

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

答案 1 :(得分:0)

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

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

这意味着浏览器会解释链接,就像文件是从/static/path/to/file.html而不是/path/to/file.html提供的一样。我发现这使得链接其他静态html文件变得更加复杂,因为它们直接链接到了。

相反,您可以只为其他网址提供重定向,以便相对于通过模板提供的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 %}

PS STATIC_FILES_ROOT是我定义的自定义变量,因为STATIC_ROOT遇到了问题