Как проверить размеры в стандартном ImageField? - PullRequest
0 голосов
/ 04 июня 2018

Имеют в проекте следующее правило: поле изображения является необязательным, а изображение по умолчанию является неинформированным случаем для пользователя.Изображения отправляются пользователем в django и должны иметь размер (ширина> = 900, высота> = 400).

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

enter image description here

Дает ошибку изображения, не найденную, даже если она находится в каталоге.Без функции проверки в admin.py она работает нормально.

models.py

class Event(models.Model):
    banner = models.ImageField('banner', upload_to='events/banners', default='events/banners/banner_padrao_eventos.png', blank=True)

admin.py

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = '__all__'

    def clean_banner(self):
        banner = self.cleaned_data.get('banner')
        if banner:
            img = Image.open(banner)
            width, height = img.size

            max_width = 900
            max_height = 400

            if width < max_width or height < max_height:
                raise forms.ValidationError(
                    'Image is incorrectly sized:% s x% s pixels. Please insert an image with% s x% s pixels.'
                    % (width, height, max_width, max_height))

            if len(banner) > (3 * 1024 * 1024):
                raise forms.ValidationError('Very large image file (maximum of 3MB).')

            name_img, ext = banner.name.split('.')
            if not (ext.lower() in ['png', 'jpg', 'jpeg']):
                raise forms.ValidationError('Please use the image in JPG, JPEG or PNG format.')
        else:
            raise forms.ValidationError('The loaded image could not be read.')
        return banner

Как сделать изображение по умолчанию для проверки при проверке?

1 Ответ

0 голосов
/ 04 июня 2018

Файл загружен в Django InMemoryUploadedFile файл, который еще не сохранен на вашем сервере, open() требует, чтобы файл существовал физически или как string bytes.Для этого вам нужен пакет PIL.Image и io.BytesIO

from io import BytesIO as StringIO
from PIL import Image

img = Image.open(StringIO(banner.read()))

Итак, img.size - это кортеж, содержащий ваши width и height

width, height = img.size
...