Как сжать изображение при загрузке в Django

Рейтинг: 0Ответов: 1Опубликовано: 01.06.2023

У меня есть базовая модель для изображений, также в ней определена функция сжатия изображения. Вот мой код в 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">

Подскажите пожалуйста как сформировать имя файла корректно с расширением?

Ответы

▲ -1

Исправь

new_filename = f"{filename}_compressed{extension}"

на

new_filename = f"{filename}_compressed.{extension}"