Как сжать изображение при загрузке в Django
У меня есть базовая модель для изображений, также в ней определена функция сжатия изображения. Вот мой код в models.py:
from django.db import models
from PIL import Image
from django.utils.text import slugify
import os
from io import BytesIO
from django.core.files.base import File, ContentFile
def compress(image):
# Сжатие изображения до 70% качества
im = Image.open(image)
im = im.convert('RGB')
im_io = BytesIO()
im.save(im_io, 'JPEG', quality=70)
filename, extension = os.path.splitext(image.name)
new_filename = f"{filename}_compressed{extension}"
new_image = ContentFile(im_io.getvalue(), name=new_filename)
print(new_image.name)
return new_image
def get_upload_path(instance, filename):
# Генерация пути для сохранения файла
return os.path.join(instance.__class__.__name__.lower(), slugify(filename))
class BaseImageModel(models.Model):
image = models.ImageField(upload_to=get_upload_path, verbose_name='Изображение')
def save(self, *args, **kwargs):
if not self.pk:
# Сжатие изображения при создании нового объекта
self.image = compress(self.image)
super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
# Удаление изображения из файловой системы при удалении объекта
self.image.delete(save=False)
super().delete(*args, **kwargs)
class Meta:
abstract = True
Функция compress сжимает изображение до 70%. В функции print(new_image.name) я получаю корректное имя файла как name.jpg, однако в админке и в коде HTML я получаю имя как namejpg, то есть без точки. Пример кода:
<img src="/media/blockgallery/3_compressedjpg" class="img-fluid" alt="Фото 1">
Подскажите пожалуйста как сформировать имя файла корректно с расширением?
Источник: Stack Overflow на русском