使用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'
。
答案 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'