@mmailcompany

Передать параметры (высота и ширина) в класс. models.ImageField?

Начал изучать Django. Понимаю, что вперед надо бы python... ну не суть.

Имеется класс для уменьшения и конвертации изображения:

fields.py

class WEBPThumbnailImg(ImageFieldFile):
    # def __init__(self, w, h):
        # self.width = w
        # self.height = h

    def save(self, name, content, save=True, max_width=200, max_height=200):
        content.file.seek(0)
        image = Image.open(content.file)
        # max_width  = 200
        # max_height = 200
        (w, h) = image.size
        if float(image.size[0]) > max_width:
            
            ......


class WEBPThumbnail(models.ImageField):
		attr_class = WEBPThumbnailImg


Как передать в модель высоту и ширину?

models.py

...

class Category(models.Model):
    name         = models.CharField("Категория", max_length=100, db_index=True)
    slug         = models.SlugField("URL", max_length=44, unique=True, db_index=True)
    # thumbnail    = models.ImageField("Миниатюра", upload_to=upload_cats_thumbnail, blank=True)
    thumbnail    = WEBPThumbnail("Миниатюра", upload_to=upload_cats_thumbnail, blank=True ) #добавить ширину и высоту?


...

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

Добавлено к вопросу:

Временное решение оставил в комментариях к ответу Dev-op. Если есть идеи и наставления, прошу отписаться...
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
@DDV23
Биокибернетик
Если вы хотите использовать класс в других проектах то первое, это не надо жестко кодировать max_width и max_height
def save(self, name, content, save=True, max_width=200, max_height=200)
Передайте через поле модели и сохраните.

class WEBPThumbnail(models.ImageField):
    def __init__(self, *args, **kwargs):
        self.max_width = kwargs.pop('max_width', 200)
        self.max_height = kwargs.pop('max_height', 200)
        super().__init__(*args, **kwargs)

    def attr_class(self):
        return WEBPThumbnailImg

    def pre_save(self, model_instance, add):
        file = super().pre_save(model_instance, add)
        if file and not file._committed:
            file.max_width = self.max_width
            file.max_height = self.max_height
        return file


Теперь вы можете использовать эти параметры в class WEBPThumbnailImg(ImageFieldFile) если ваши условия True то сохраняете изображения с новыми парметрами.

Используйте в вашей модели.
class Category(models.Model)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы