Джанго: sorl-thumbnail и easy-thumbnail в одном проекте - PullRequest
12 голосов
/ 18 ноября 2011

Я работаю над проектом и использую два отдельных модульных приложения Django.Тем не менее, одно приложение требует простых миниатюр, а другое требует sorl-миниатюр.К сожалению, две библиотеки миниатюр используют синтаксис тега шаблона {% load thumbnail%}, поэтому они конфликтуют и ломаются, когда шаблон, использующий их, пытается визуализироваться.

Есть ли какие-либо подходы к решению этого типа столкновений?(Например, опция шаблона делает эффект {% load thumbnail as easy_thumbnail%}).Мне придется раскошелиться на одно из приложений и заменить одну из библиотек миниатюр на другую?Если да, то к чему мне обратиться?

Спасибо, что рассмотрели мой вопрос, Джо

Ответы [ 4 ]

12 голосов
/ 03 февраля 2016

В Django 1.9 вы можете использовать опцию libraries DjangoTemplates, чтобы включить библиотеку тегов под указанным именем.В приведенном ниже примере библиотека миниатюр из sorl.thumbnail включена под именем sorl_thumbnail.

Примечание: Сам шаблонный тег не изменяется внутри шаблона ... т.остается 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 %}
11 голосов
/ 18 ноября 2011

Конечно, просто напишите свою собственную заглушку easy_thumbnail wrapper ...

  1. Создайте пакет thumbnailtags в одном из ваших приложений django ...
  2. ... убедившись, что у него есть пустое __init__.py
  3. В 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)
    
  4. Использование {% load easy_thumbnail %}

Примечание:

Вы также можете сделать импорт миниатюр как easy_thumbnail и пропустить бит def easy_thumbnail, хотя я этого не пробовал.

6 голосов
/ 09 ноября 2012
2 голосов
/ 15 октября 2015

ОБНОВЛЕНИЕ 2015

Мне пришлось внести следующие изменения в ответ Тома Кристи, чтобы заставить это работать:

  1. создайте пакет templatetags в одном из локальных приложений. Важно назвать это templatetags. См. django docs для тегов шаблона.
  2. ... убедитесь, что он имеет __init__.py, пустой или нет.
  3. В 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)
    
  4. Используйте {% load easy_thumbnail %} или - load easy_thumbnail с pyjade

...