如何在默认ImageField中验证尺寸?

时间:2018-06-04 13:45:42

标签: python django django-models

在项目中有以下规则:图像字段是可选的,默认图像是用户的无法通知的案例。图像由用户在django中发送,并且必须具有尺寸(宽度> = 900,高度> = 400)。

我正在尝试验证admin.py中的维度,但是当我尝试在imagefield中具有默认参数时进行注册时会出现问题。

enter image description here

即使它在目录中,也会发现找不到图像错误。没有admin.py中的验证功能,它可以正常工作。

models.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

admin.py

/Home/About
/Home/Contact
/Identity/Account/Login
/Identity/Account/Register

如何在验证中考虑默认图像?

1 个答案:

答案 0 :(得分:0)

上传的文件是Django InMemoryUploadedFile文件,它尚未保存在您的服务器中,open()需要该文件是物理存在的,还是string bytes。为此,您需要包PIL.Imageio.BytesIO

from io import BytesIO as StringIO
from PIL import Image

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

现在,img.size是包含widthheight

的元组
width, height = img.size