Мне не удалось настроить вывод в шаблон с помощью {% static_webp 'modelImage.url' %}
. Но я смог преобразовать файл при загрузке и сразу сохранить файлы в желаемом формате (webp). Мое решение может быть полезно для тех, кто разрабатывает новый проект, потому что мой метод не предполагает ранее сохраненных файлов в модели. Итак, начнем по порядку.
models.py В моей модели (Каталоге) я переопределил путь к месту хранения изображений, вызвав функцию (rename_file
). Функция (rename_file
) переименовывает расширение нашего файла в .webp, создавая правильный obj.url
. Это нужно сделать немедленно. Потому что obj.url
имеет атрибут только для чтения.
from django.db import models
from datetime import date
image_path = os.path.abspath(settings.MEDIA_ROOT + '/photos/asics/' + date.today().strftime('%Y/%m/%d/'))
def rename_file(instance, filename):
if filename.find('.') >= 0:
dot_index = (len(filename) - filename.rfind('.', 1)) * (-1)
filename = filename[0:dot_index]
filename = '{}.{}'.format(filename, 'webp')
return os.path.join(image_path, filename)
class Catalog(models.Model):
photo = models.ImageField(upload_to=rename_file, blank=True)
admin.py Изображения добавляются в мое приложение через панель администратора. Поэтому я решил преобразовать изображения в этом файле, но это не имеет значения. Здесь я использую сигналы (post_save) для вызова функции (convert_image), которая преобразует изображение в желаемый формат (.webp) и заменяет файл Origanal новым файлом.
from django.contrib import admin
from .models import Catalog
from PIL import Image
from django.db.models.signals import post_save
@receiver(post_save, sender=Catalog)
def convert_image(instance, **kwargs):
if image_name:
im = Image.open(image_name).convert('RGB')
output_path = str(image_name)
im.save(output_path, 'webp')
class CatalogAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
global image_name
image_name = obj.photo
super().save_model(request, obj, form, change)