Não consigo encontrar nenhuma maneira de miniatura de um arquivo estático (em STATIC_ROOT). Parece funcionar apenas em arquivos externos (http://....) e de mídia (em MEDIA_ROOT).
Isso é muito útil quando o tamanho de saída de uma imagem estática nem sempre é o mesmo (seja pelas preferências do usuário, temas, etc.)
Você precisa usar algum armazenamento que use STATIC_ROOT, por exemplo, você pode usar 'django.core.files.storage.FileSystemStorage' e instanciar com location=settings.STATIC_ROOT e base_url=settings.STATIC_URL, por favor continue no stackoverflow, pois isso não é um erro.
Após cinco anos ainda não há possibilidade de gerar thumbs de arquivos estáticos sem alterar o armazenamento DEFAULT, por causa de https://github.com/mariocesar/sorl-thumbnail/blob/master/sorl/thumbnail/base.py#L100
StackOverflow não ajudará devido à implementação.
Alguma chance de CORRIGIR isso? Passar a instância de armazenamento personalizada via get_thumbnail()
será suficiente.
Aqui está um exemplo de um patch https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab
EDIT : desculpe, parece que a saída de thumbnail.url
é válida, mas quando recuperada de cached.url
é prefixada com /media/
em vez de /static/
. Há algo mais quebrado por dentro.
EDIT (2) : há um problema de design na desserialização do código de armazenamento - a classe de armazenamento é carregada e instanciada com padrões em vez de usar a instância existente. Em outras palavras - sorl.thumbnail não reutiliza a instância de armazenamento, mas cria a própria (configurada de maneira diferente). Como solução alternativa, podemos herdar do FileSystemStorage e definir o inicializador personalizado.
Depois de aplicá-lo, qualquer pessoa pode facilmente gerar miniaturas para qualquer coisa.
É possível criar uma tag de modelo personalizada como esta:
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)
Observe que as configurações não precisam ser alteradas.
Comentários muito úteis
Aqui está um exemplo de um patch https://github.com/marcinn/sorl-thumbnail/commit/61557b41169f0656063c557735ef62908a5fcaab
EDIT : desculpe, parece que a saída de
thumbnail.url
é válida, mas quando recuperada decached.url
é prefixada com/media/
em vez de/static/
. Há algo mais quebrado por dentro.EDIT (2) : há um problema de design na desserialização do código de armazenamento - a classe de armazenamento é carregada e instanciada com padrões em vez de usar a instância existente. Em outras palavras - sorl.thumbnail não reutiliza a instância de armazenamento, mas cria a própria (configurada de maneira diferente). Como solução alternativa, podemos herdar do FileSystemStorage e definir o inicializador personalizado.
Depois de aplicá-lo, qualquer pessoa pode facilmente gerar miniaturas para qualquer coisa.
É possível criar uma tag de modelo personalizada como esta:
Observe que as configurações não precisam ser alteradas.