Django: эскиз сорвала и легкий эскиз в том же проекте
Я работаю над проектом, который использует два отдельных модульных приложения Django. Тем не менее, для одного приложения требуются легкие эскизы, а для другого требуются миниатюры. К сожалению, две миниатюрные библиотеки используют синтаксис тэга шаблона {% load thumbnail%}, поэтому они сталкиваются и ломаются, когда используемый ими шаблон пытается отобразить.
Существуют ли какие-либо подходы к решению этого типа столкновения? (Например, параметр шаблона делает эффект {% load thumbnail как easy_thumbnail%}). Должен ли я раскошелиться на одно из приложений и заменить одну из миниатюрных библиотек на другую? Если да, с чем я должен пойти?
Спасибо за рассмотрение моего вопроса,
Джо
Ответы
Ответ 1
В Django 1.9 вы можете использовать опцию libraries
DjangoTemplates
, чтобы включить библиотеку тегов под заданным именем. В приведенном ниже примере миниатюрная библиотека из sorl.thumbnail
включена под именем sorl_thumbnail
.
Примечание: сам templatetag не изменяется в шаблоне... т.е. остается thumbnail
Использование:
settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, "foo", "templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'libraries': {
'sorl_thumbnail': 'sorl.thumbnail.templatetags.thumbnail',
},
},
},
]
your_template.html
{% load sorl_thumbnail %}
{% thumbnail mymodel.image "640x480" crop="center" as im %}
<img src="{{ im.url }}" width="{{im.width}}" height="{{im.height}}"/>
{% endthumbnail %}
Ответ 2
Конечно, просто напишите свою собственную заглушку easy_thumbnail...
- Создайте пакет
thumbnailtags
в одном из ваших приложений django...
- ... убедившись, что он получил пустой
__init__.py
-
В thumbnailtags/easy_thumbnail.py
выполните что-то вроде:
from django.template import Library
from easy_thumbnails.templatetags import thumbnail
register = Library()
def easy_thumbnail(parser, token):
return thumbnail(parser, token)
register.tag(easy_thumbnail)
- Используйте
{% load easy_thumbnail %}
Примечание:
Вы также можете сделать "импортировать миниатюру как easy_thumbnail" и пропустить бит def easy_thumbnail
, но я этого не пробовал.
Ответ 3
Эта ссылка в блоге показывает, как справиться с этим.
https://timmyomahony.com/blog/using-sorl-thumbnail-and-easy-thumbnails-same-template/
(ранее
http://timmyomahony.com/blog/2012/10/22/using-sorl-thumbnail-and-easy-thumbnails-same-template/)
Ответ 4
UPDATE 2015
Я должен был внести следующие изменения в ответ Тома Кристи, чтобы заставить это работать:
- создайте пакет
templatetags
в одном из локальных приложений. Очень важно называть его templatetags
. См. django docs для тегов шаблонов.
- ... убедитесь, что он имеет
__init__.py
, пустой или нет.
-
В templatetags/easy_thumbnail.py
сделайте следующее:
from django.template import Library
from easy_thumbnails.templatetags import thumbnail
register = Library()
def easy_thumbnail(parser, token):
return thumbnail.thumbnail(parser, token) # the important bit
register.tag(easy_thumbnail)
-
Используйте {% load easy_thumbnail %}
или - load easy_thumbnail
с помощью pyjade