【问题标题】:managing relative urls in static html files for django在 django 的静态 html 文件中管理相对 url
【发布时间】:2012-10-19 10:53:44
【问题描述】:

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

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

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

有没有办法纠正 django 中的这个相对 url 问题?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    可以添加一个 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 %}
    

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

    【讨论】:

      【解决方案2】:

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

      除了作为一个框架,django 还希望 html 模板驻留在您的应用程序中或 project/templates/app/ 级别的 templates 中。像图像这样的静态资产应该按照here 的描述进行管理。用户上传的媒体应该被处理为media files

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-06
        • 2015-08-16
        • 1970-01-01
        • 2013-01-11
        • 2012-02-03
        • 2014-10-31
        • 2019-03-05
        相关资源
        最近更新 更多