Я не могу найти способ миниатюры статического (в STATIC_ROOT) файла. Кажется, он работает только с внешними (http://....) и мультимедийными (в MEDIA_ROOT) файлами.
Это очень полезно, когда выходной размер статического изображения не всегда одинаков (будь то из-за пользовательских настроек, тем и т. д.).
Вам нужно использовать какое-то хранилище, которое использует STATIC_ROOT, например, вы можете использовать 'django.core.files.storage.FileSystemStorage' и создать экземпляр с location=settings.STATIC_ROOT и base_url=settings.STATIC_URL, пожалуйста, продолжайте на stackoverflow, так как это не ошибка.
Спустя пять лет все еще нет возможности генерировать превью из статических файлов без изменения хранилища ПО УМОЛЧАНИЮ из-за https://github.com/mariocesar/sorl-thumbnail/blob/master/sorl/thumbnail/base.py#L100 .
StackOverflow не поможет из-за реализации.
Есть ли шансы это исправить? Достаточно передать экземпляр пользовательского хранилища через get_thumbnail()
.
Вот пример патча https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab
РЕДАКТИРОВАТЬ : извините, кажется, что вывод из thumbnail.url
действителен, но при извлечении из cached.url
он имеет префикс /media/
вместо /static/
. Внутри еще что-то сломано.
РЕДАКТИРОВАТЬ (2) : существует проблема дизайна при десериализации кода хранилища - класс хранилища загружается и создается со значениями по умолчанию вместо использования существующего экземпляра. Другими словами - sorl.thumbnail не использует экземпляр хранилища повторно, а создает собственный (настроенный по-другому). В качестве обходного пути мы можем наследоваться от FileSystemStorage и определить собственный инициализатор.
После его применения любой может легко создавать миниатюры для чего угодно.
Можно создать собственный тег шаблона, подобный этому:
from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django import template
from sorl.thumbnail.templatetags.thumbnail import ThumbnailNode
register = template.Library()
class StaticThumbnailStorage(FileSystemStorage):
def __init__(self, *args, **kw):
super(StaticThumbnailStorage, self).__init__(
*args, location='/path/to/custom/static/'
base_url=settings.STATIC_URL, **kw)
storage = StaticThumbnaikStorage()
class StaticThumbnailNode(ThumbnailNode):
def _get_thumbnail(self, file_, geometry, **options):
options['storage'] = storage
return super(StaticThumbnailNode, self)._get_thumbnail(
file_, geometry, **options)
@register.tag
def static_thumbnail(parser, token):
return StaticThumbnailNode(parser, token)
Обратите внимание, что настройки менять не нужно.
Самый полезный комментарий
Вот пример патча https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab
РЕДАКТИРОВАТЬ : извините, кажется, что вывод из
thumbnail.url
действителен, но при извлечении изcached.url
он имеет префикс/media/
вместо/static/
. Внутри еще что-то сломано.РЕДАКТИРОВАТЬ (2) : существует проблема дизайна при десериализации кода хранилища - класс хранилища загружается и создается со значениями по умолчанию вместо использования существующего экземпляра. Другими словами - sorl.thumbnail не использует экземпляр хранилища повторно, а создает собственный (настроенный по-другому). В качестве обходного пути мы можем наследоваться от FileSystemStorage и определить собственный инициализатор.
После его применения любой может легко создавать миниатюры для чего угодно.
Можно создать собственный тег шаблона, подобный этому:
Обратите внимание, что настройки менять не нужно.