Не разрешать изображения меньше определенных размеров - PullRequest
0 голосов
/ 31 января 2019

У меня есть модель, которая сохраняет изображения профиля пользователя.Если загружаемое изображение больше 200x200 пикселей, мы изменяем размер до 200x200.Если изображение имеет размер 200x200, то мы возвращаем это изображение.Теперь я хочу, чтобы пользователь выдал ошибку, говорящую, что это изображение слишком маленькое и недопустимо.Вот что у меня есть:

class Profile(models.Model):
    GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    user    = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    bio     = models.CharField(max_length=200, null=True)
    avatar  = models.ImageField(upload_to="img/path")
    gender  = models.CharField(max_length=1, choices=GENDER_CHOICES, null=True)

    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)
        if self.avatar:
            image = Image.open(self.avatar)
            height, width = image.size
            if height == 200 and width == 200:
                image.close()
                return

            if height < 200 or width < 200:
                return ValidationError("Image size must be greater than 200")
            image = image.resize((200, 200), Image.ANTIALIAS)
            image.save(self.avatar.path)
            image.close()

Когда изображение меньше 200 пикселей по ширине или высоте, оно не должно быть загружено.Тем не менее, изображение загружается.Как я могу предотвратить это?

1 Ответ

0 голосов
/ 31 января 2019

Вместо того, чтобы делать это в методе save(), вы можете сделать это в формах:

from django.core.files.images import get_image_dimensions
from django import forms

class ProfileForm(forms.ModelForm):
   class Meta:
       model = Profile

   def clean_avatar(self):
       picture = self.cleaned_data.get("avatar")
       if not picture:
           raise forms.ValidationError("No image!")
       else:
           w, h = get_image_dimensions(picture)
           if w < 200:
               raise forms.ValidationError("The image is %i pixel wide. It's supposed to be more than 200px" % w)
           if h < 200:
               raise forms.ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)
       return picture

Причина этого в том, что, когда вы вызвали save(), изображение уже загружено.Так что лучше делать это в формах.

...