Для работы с миниатюрами есть
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')