Получите URL без хеширования при использовании ManifestStaticFilesStorage Django - PullRequest
0 голосов
/ 22 января 2019

При использовании ManifestStaticFilesStorage шаблонная функция static всегда возвращает «хэшированное» имя файла (когда DEBUG=False).Есть ли способ получить обычное имя файла без хеширования в шаблоне?Кажется странным, что нет очевидного пути, поскольку collectstatic всегда включает в себя как хешированные, так и не хэшированные файлы, но не хэшированные никогда не будут использоваться.

Я предполагаю, что мне нужно сделать, это создатьмой собственный тег шаблона, но мне было интересно, пропустил ли я что-то.

РЕДАКТИРОВАТЬ, чтобы уточнить, что я хочу ...

Прямо сейчас {% 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 голосов
/ 14 марта 2019

По сути, я просто хочу объединить 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/css/style.css ', если STATIC_URL is '/ static /'

0 голосов
/ 01 февраля 2019

Если вы не хотите использовать STATIC_URL, но продолжаете использовать тег шаблона url, вы можете переопределить url() в своем пользовательском подклассе ManifestStaticFileStorage:

# 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. Класс хранилища staticfiles добавляет уровень абстракции, проверяет фрагмент URL-адреса и выполняет цитирование URL-адреса.

...