Сохранение метаданных изображений при рендеринге 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 именем моего пересмотренного файла тегов в каждом из соответствующих шаблонов, создающих рендеринг.

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

Вернуться на верх