Сохранение метаданных изображений при рендеринге Wagtail
Я хотел бы найти способ сохранить некоторые или все метаданные изображения, когда Wagtail генерирует рендеринг из оригинала.
В документации Wagtail я нашел следующее упоминание о функции <generate_rendition_file>:
ПРИМЕЧАНИЕ: Ответственность за генерацию нового изображения из исходного лежит на предоставленном объекте фильтра. Если вы хотите делать с изображениями рендеринга что-то свое (например, сохранять метаданные исходного изображения), вам стоит заменить filter на экземпляр подкласса Filter вашей разработки.
В нем упоминается использование фильтра, но поскольку я новичок в Django и Wagtail, я не смог определить, как и где он может быть использован.
Вот пример моего кода, создающего рендеры:
{% image picture max-800x600 format-webp preserve-svg as picture_image %}
{% image picture max-1600x1600 format-webp preserve-svg as original_image %}
Я буду благодарен за любую помощь или руководство, чтобы разобраться с этим.
Мне удалось реализовать решение, которое помогло мне, и, возможно, другим оно тоже пригодится.
В конце концов я отказался от идеи сохранения метаданных, поскольку хотел установить только определенные теги exif, общие для всех изображений.
Кратко описанные шаги выглядят следующим образом:
Создайте пользовательскую модель изображения (по этому вопросу существует множество руководств)
Я скопировал существующий код для get_rendition и просто добавил вызов другого метода, который устанавливает значения exif. Изменения выглядят следующим образом:
try:
rendition = self.find_existing_rendition(filter)
except Rendition.DoesNotExist:
rendition = self.create_rendition(filter)
# Reuse this rendition if requested again from this object
self._add_to_prefetched_renditions(rendition)
#only set exif for new renditions
self.set_custom_exif(rendition)
При установке значений exif использовалась стандартная библиотека Pillow.
Я скопировал файл shortcuts.py в свое приложение. Я внес небольшие изменения в get_rendition_or_not_found
:
заменяя return image.get_rendition(specs)
на return CustomImage.get_custom_rendition(image, specs)
Оглядываясь назад, можно сказать, что этот шаг не требовался, так как wagtailimages_tags
мог использовать мой новый shortcuts.py
, но в любом случае я скопировал и переименовал 'wagtailimages_tags' в моем приложении.
Я изменил следующий импорт, чтобы он ссылался на мой новый shortcuts.py
:
from wagtail.images.shortcuts import (
get_rendition_or_not_found,
get_renditions_or_not_found,
)
Наконец, я просто заменил ссылки на wagtailimages_tags
именем моего пересмотренного файла тегов в каждом из соответствующих шаблонов, создающих рендеринг.
Я уверен, что это решение, скорее всего, не самое элегантное, но оно дало мне результат, с которым я могу жить, по крайней мере до тех пор, пока не появится лучшее решение.