使用Django的ManifestStaticFilesStorage时获取非哈希网址

时间:2019-01-22 15:54:12

标签: django django-staticfiles

使用ManifestStaticFilesStorage时,static模板函数总是返回“哈希”文件名(当DEBUG=False时)。有什么方法可以在模板中获取非哈希常规文件名?奇怪的是,由于collectstatic始终同时包含散列文件和非散列文件,因此没有明显的方法,但是从未使用过非散列文件。

我猜我需要做的是创建自己的templatetag,但想知道我是否错过了什么。

编辑以澄清我想要的内容...

现在{% static 'css/style.css' %}输出类似/static/css/style.a163843f12bc.css的内容,而我希望它产生/static/css/style.css,它应该始终是最新版本。

我想另一种解决方案是通过在上下文处理器列表中添加{{ STATIC_URL }}css/style.css来使用'django.template.context_processors.static'

2 个答案:

答案 0 :(得分:0)

如果您不想使用STATIC_URL,而是继续使用url模板标记,则可以在ManifestStaticFileStorage的自定义子类中覆盖url()

# add kwarg "clean"
def url(self, name, force=False, clean=False):
    if clean:
        return self._url(self.clean_name, name, force)
    return self._url(self.stored_name, name, force)

stored_name(name)返回哈希版本clean_name(name)(相同的方法签名)时,只是将反斜杠替换为斜杠并返回纯名称。

这是未测试的而从在Django /了contrib / staticfiles / storage.py它看起来像这样可以工作。

的代码

要激活,你需要点您的自定义FileStorage类settings.STATICFILES_STORAGE它。

在你的模板,等。无论您要使用的散列的名字,你会写:

{% static 'css/style.css' clean=True %}

关于static的工作原理的一些见解:

    @classmethod
    def handle_simple(cls, path):
        if apps.is_installed('django.contrib.staticfiles'):
            from django.contrib.staticfiles.storage import staticfiles_storage
            return staticfiles_storage.url(path)
        else:
            return urljoin(PrefixNode.handle_simple("STATIC_URL"), quote(path))

因此,这意味着使用{{ STATIC_URL }}与没有静态文件应用程序的{% static %}并不遥远。所述staticfiles存储类为URL片段的抽象层,支票和确实URL引用。

答案 1 :(得分:0)

基本上,我想要的只是将STATIC_URL与相对文件路径连接在一起。但是,static模板标记添加了更多功能,例如适当的转义空格并允许分配给模板变量,因此我从Django源代码中派生了以下内容(可能需要对Django 2.0及更高版本进行更改)并将其添加到应用作为“ templatetags / simple_static.py”:

from django import template
from django.templatetags.static import PrefixNode
from django.utils.six.moves.urllib.parse import quote, urljoin

register = template.Library()


@register.simple_tag
def simple_static(path):
    """
    Simple concatenation of path with STATIC_URL

    Usage::

        {% static_simple path [as varname] %}

    Examples::

        {% static_simple "myapp/css/base.css" %}
        {% static_simple variable_with_path %}
        {% static_simple "myapp/css/base.css" as admin_base_css %}
        {% static_simple variable_with_path as varname %}
    """
    return urljoin(PrefixNode.handle_simple("STATIC_URL"), quote(path))

然后在模板中可以执行以下操作:

{% load simple_static %}{% static 'css/style.css' %}

如果STATIC_URL是'/ static /',它将输出'/static/css/style.css'