Spec-Zone.ru › Wagtail

Генерация редишен в 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

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

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

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

Новое в версии 4.0: Метод prefetch_renditions применим только в версиях Wagtail 4.0 и выше.

Наборы запросов изображений

При работе с набором запросов Image вы можете использовать встроенный метод набора запросов Wagtail prefetch_renditions для предварительной загрузки необходимых редишен.

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

def get_images_uploaded_by_user(user):
    return ImageModel.objects.filter(uploaded_by_user=user)

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

def get_images_uploaded_by_user(user)::
    return ImageModel.objects.filter(uploaded_by_user=user).prefetch_renditions()

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

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

def get_images_uploaded_by_user(user):
    # Only specify the renditions required for rendering
    return ImageModel.objects.filter(uploaded_by_user=user).prefetch_renditions(
        "fill-700x586", "min-600x400", "max-940x680"
    )

Наборы запросов, не относящиеся к изображениям

Если вы работаете с моделью, не являющейся изображением, вы можете использовать встроенный метод набора запросов 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")

Если вы заранее знаете необходимые редишен, вы можете отфильтровать набор запросов редишен, чтобы использовать:

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


def get_events():
    Image = get_image_model()
    filters = ["fill-300x186", "fill-600x400", "fill-940x680"]

    # `Prefetch` is used to fetch only the required renditions
    prefetch_images_and_renditions = Prefetch(
        "listing_image",
        queryset=Image.objects.prefetch_renditions(*filters)
    )
    return EventPage.objects.live().prefetch_related(prefetch_images_and_renditions)

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

Новое в версии 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/stable/advanced_topics/images/renditions.html

Spec-Zone.ru

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