在每个模型上创建缩略图save()

时间:2014-01-20 04:57:38

标签: python django django-models python-imaging-library

class UserProfile(models.Model):
 user = models.OneToOneField(User, related_name="person")
 image = models.ImageField(upload_to='site-media/media/userimages/', default = 'site-media/user_default.jpeg')
 thumbnail = models.ImageField(upload_to="site-media/media/userimages/userthumbs/", blank=True, null=True)
 thumbnail2 = models.ImageField(upload_to="site-media/media/userimages/userthumbs2/", blank=True, null=True)
 pub_date = models.DateTimeField(auto_now_add=True)
 bio = models.CharField(max_length=300, blank = True)

def create_thumbnail(self):
    if not self.image:
        return

    IMAGE_SIZE = (150,150)

    user_name = self.user.username
    image = Image.open(StringIO(self.image.read()))
    imagef = ImageOps.fit(image, IMAGE_SIZE, Image.ANTIALIAS)

    temp_handle = StringIO()
    imagef.save(temp_handle, 'jpeg')
    temp_handle.seek(0)

    suf = SimpleUploadedFile(os.path.split(self.image.name)[-1],
            temp_handle.read(), content_type='image/jpeg')
    self.image.save('%s.%s'%(user_name,'jpeg'), suf, save=False)

    THUMBNAIL_SIZE = (100,100)

    image = Image.open(StringIO(self.image.read()))
    thumb = ImageOps.fit(image, THUMBNAIL_SIZE, Image.ANTIALIAS)

    temp_handle = StringIO()
    thumb.save(temp_handle, 'jpeg')
    temp_handle.seek(0)

    suf = SimpleUploadedFile(os.path.split(self.image.name)[-1],
            temp_handle.read(), content_type='image/jpeg')
    self.thumbnail.save('%s_thumb.%s'%(user_name,'jpeg'), suf, save=False)

    THUMBNAIL2_SIZE = (32,32)

    thumb2 = ImageOps.fit(image, THUMBNAIL2_SIZE, Image.ANTIALIAS)

    temp_handle = StringIO()
    thumb2.save(temp_handle, 'jpeg')
    temp_handle.seek(0)

    suf = SimpleUploadedFile(os.path.split(self.image.name)[-1],
            temp_handle.read(), content_type='image/jpeg')
    self.thumbnail2.save('%s_thumb2.%s'%(user_name,'jpeg'), suf, save=False)

def save(self, *args, **kwargs):
    """Save image dimensions."""
    self.create_thumbnail()

    super(UserProfile, self).save(*args, **kwargs)

这是用户个人资料的模型。它很棒。这段代码的问题在于,每当我更新文本字段时,都会再次创建缩略图和图像,而不会删除之前的缩略图和图像。这绝对是一件坏事。那么,有没有办法避免每次更新文本字段时图像和缩略图的副本?我想在视图中创建缩略图,但是,我无法编写工作代码。

1 个答案:

答案 0 :(得分:0)

使用solr-thumbnail作业。

只需使用应用提供的ImageField,您的所有麻烦都将消失。 :)

在您的情况下,您只需要模型中的image字段。使用solr-thumbnail,您只需要一个文件来创建各种大小的缩略图。当原始文件不再存在时,该应用程序还会删除缩略图。

Installation process也是一件轻而易举的事。