@Tiran_94
Python Django

Как работать в Django с ImageField проверять, изменять размеры фото?

Припустим есть галерея с фото, на странице их много, >100<200.
Как лучше реализовать миниатюрную копию фото с размерами примерно 200*200, большую 800*800 и оригинал?
Как проверять размер фото перед загрузкой?
  • Вопрос задан
  • 1480 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Для работы с миниатюрами есть easy-thumbnails, можно не изобретать велосипед. А для проверки размера загружаемого изображения можно определить свой класс поля:
class LimitedImageField(ImageField):
    def __init__(self, *args, **kwargs):
        self.max_upload_size = kwargs.pop('max_upload_size', None)
        self.min_dim = kwargs.pop('min_dim', None)
        self.max_dim = kwargs.pop('max_dim', None)
        if not self.max_upload_size:
            self.max_upload_size = settings.FILE_UPLOAD_MAX_MEMORY_SIZE
        super(LimitedImageField, self).__init__(*args, **kwargs)

    def clean(self, *args, **kwargs):
        data = super(LimitedImageField, self).clean(*args, **kwargs)
        try:
            img_file = data.file
            if img_file.size > self.max_upload_size:
                err_msg = 'Размер файла не должен превышать {}'.format(filesizeformat(self.max_upload_size))
                raise forms.ValidationError(err_msg)

            w, h = get_image_dimensions(img_file)
            if self.min_dim:
                if (w < self.min_dim[0]) or (h < self.min_dim[1]):
                    err_msg = 'Разрешение изображения не должно быть меньше, чем {}x{}'.format(*self.min_dim)
                    raise forms.ValidationError(err_msg)
            if self.max_dim:
                if (w > self.max_dim[0]) or (h > self.max_dim[1]):
                    err_msg = 'Разрешение изображения не должно превышать {}x{}'.format(*self.max_dim)
                    raise forms.ValidationError(err_msg)
        except AttributeError:
            pass
        return data

И потом в форме или модели
image = LimitedImageField('Изображение', min_dim=(100, 100), max_dim=(300, 300),
                          help_text='Разрешение от 100x100 до 300х300')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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