Spec-Zone.ru › Wagtail 3

Генерация редишен в Python

Рендеренные версии исходных изображений, сгенерированные тегом шаблона Wagtail {% image %} , называются «редишен» и хранятся как новые файлы изображений в каталоге сайта [media]/images при первом вызове.

Изображение редишен также можно генерировать динамически из Python с помощью метода get_rendition(), например:

newimage = myimage.get_rendition('fill-300x150|jpegquality-60')

Если у myimage было имя файла foo.jpg, новая редишен изображения с именем foo.fill-300x150.jpegquality-60.jpg будет сгенерирована и сохранена в каталоге сайта [media]/images. Параметры аргументов идентичны спецификации фильтра тега {% image %} шаблона и должны быть разделены |.

Сгенерированный объект Rendition будет иметь свойства, специфичные для этой версии изображения, такие как url, width и height, поэтому что-то вроде этого можно использовать в генераторе API, например:

url = myimage.get_rendition('fill-300x186|jpegquality-60').url

Свойства, относящиеся к исходному изображению, из которого была создана сгенерированная редишен, такие как title, можно получить через свойство редишен image:

>>> newimage.image.title
'Blue Sky'
>>> newimage.image.is_landscape()
True

См. также: Как использовать изображения в шаблонах

Предварительная загрузка изображений редишен

Новое в версии 3.0: Следующее руководство применимо только к версиям Wagtail 3.0 и выше.

При использовании набора запросов для рендеринга списка объектов с изображениями можно использовать встроенный метод набора запросов Django prefetch_related() для предварительной загрузки необходимых редишен для рендеринга с помощью одного дополнительного запроса. Для длинных списков элементов или там, где для каждого элемента используется несколько редишен, это может значительно повысить производительность.

Например, предположим, что вы рендерите список событий (с миниатюрными изображениями для каждого). Ваш код может выглядеть примерно так:

def get_events():
    return EventPage.objects.live().select_related("listing_image")

Вышеизложенное можно немного изменить, чтобы предварительно загрузить редишен для списка изображений:

def get_events():
    return EventPage.objects.live().select_related("listing_image").prefetch_related("listing_image__renditions")

Если изображения в вашем проекте имеют очень большое количество редишен, и вы заранее знаете необходимые, вы можете рассмотреть использование объекта Prefetch для выбора только необходимых редишен для рендеринга. Например:

from django.db.models import Prefetch
from wagtail.images import get_image_model


def get_events():
    # These are the renditions required for rendering
    renditions_queryset = get_image_model().get_rendition_model().objects.filter(
        filter_spec__in=["fill-300x186", "fill-600x400", "fill-940x680"]
    )

    # `Prefetch` is used to fetch only the required renditions
    return EventPage.objects.live().select_related("listing_image").prefetch_related(
        Prefetch("listing_image__renditions", queryset=renditions_queryset)
    )

Методы модели, участвующие в генерации редишен

Новое в версии 3.0: Следующие ссылки на методы применимы только к версиям Wagtail 3.0 и выше.

Следующие методы модели AbstractImage участвуют в поиске и генерации редишен. Если вы используете пользовательскую модель изображения, вы можете настроить поведение любого из этих методов, переопределяя их в своей модели:

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/advanced_topics/images/renditions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API