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