Django custom validation in model form for imagefield (max file size etc.)

不想你离开。 提交于 2019-12-04 11:52:00
Jure C.

Just answering here for the record:

The poster didn't check the form.cleaned_data(), which means that clean_xxx validation didn't get run.

Medeiros

The name of method should be clean_<field name>, in this case clean_banner.

For future reference I will place a snippet of code that I used in one recent project (names must be adapted to work with OP code):

from PIL import Image
from django.utils.translation import ugettext as _

def clean_photo(self):
    image = self.cleaned_data.get('photo', False)

    if image:
        img = Image.open(image)
        w, h = img.size

        #validate dimensions
        max_width = max_height = 500
        if w > max_width or h > max_height:
            raise forms.ValidationError(
                _('Please use an image that is smaller or equal to '
                  '%s x %s pixels.' % (max_width, max_height)))

        #validate content type
        main, sub = image.content_type.split('/')
        if not (main == 'image' and sub.lower() in ['jpeg', 'pjpeg', 'png', 'jpg']):
            raise forms.ValidationError(_('Please use a JPEG or PNG image.'))

        #validate file size
        if len(image) > (1 * 1024 * 1024):
            raise forms.ValidationError(_('Image file too large ( maximum 1mb )'))
    else:
        raise forms.ValidationError(_("Couldn't read uploaded image"))
    return image
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!