class ExtendedImageField(models.ImageField): """ Extended ImageField which can resize image before saving it. """ def __init__(self, *args, **kwargs): self.width = kwargs.pop('width', None) self.height = kwargs.pop('height', None) super(ExtendedImageField,self).__init__(*args, **kwargs) def get_save_FIELD_file(self): def _save_FIELD_file(instance, filename, raw_contents, save=True): """ Resize on the fly raw contents of field and call parent save_field method. """ if self.width and self.height: raw_contents = resize_image(rawdata=raw_contents, width=self.width, height=self.height) filename_ext = filename.split(".")[-1:] filename_name = md5.new(str(time.time())).hexdigest() filename = "%s.%s" % (filename_name, filename_ext) instance._save_FIELD_file(self, filename, raw_contents, save) return _save_FIELD_file def contribute_to_class(self, cls, name): super(ExtendedImageField, self).contribute_to_class(cls, name) # overwrite parent binding to 'save_%s_file' setattr(cls, 'save_%s_file' % self.name, self.get_save_FIELD_file()) def get_internal_type(self): return 'ImageField'