模型保存方法。保存前调整图像大小

时间:2010-09-08 12:51:06

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

我正在尝试在保存之前调整图像大小。我在模型上使用自定义保存方法,但我遇到了麻烦。

这是我现在的代码:

class UserImages(models.Model):
    height = models.CharField(blank=True, max_length=100)
    width = models.CharField(blank=True, max_length=100)
    image = models.ImageField(upload_to="UserImages/%Y/%m/%d", height_field='height', width_field='width')
    owner = models.ForeignKey(User)

    def __unicode__(self):
        return str(self.image)
    def save(self, *args, **kwargs):
        if self.image:
            filename = str(self.image.path)
            img = Image.open(filename)

            if img.mode not in ('L', 'RGB'):
                img = img.convert('RGB')

            img = ImageOps.fit(img, (180,240), Image.ANTIALIAS, 0, (0.5, 0.5))
            img.save(self.image.path)
        super(UserImages, self).save(*args, **kwargs)

此操作失败并告诉我无法找到该文件。据我所知,这与图像到目前为止只存在于内存中的事实有关,因此无法像这样打开。

所以我的问题是:如何从内存中打开图像并将其保存回内存,以便默认的保存方法可以用它来做它的事情?

非常感谢任何帮助,这让我起了作用:)

2 个答案:

答案 0 :(得分:1)

您需要在尝试访问UserImages之前保存ImageField

可以在此代码段中找到如何执行此操作的示例:

基本上:

super(UserImages, self).save()

PS。您的模型应具有单数名称,例如UserImage代替UserImages

答案 1 :(得分:1)

使用django-resized

pip install django-resized

models.py

from django_resized import ResizedImageField

class MyModel(models.Model):
    ...
    image = ResizedImageField(max_width=500, max_height=300, upload_to='whatever')

有关详细信息,请查看https://github.com/un1t/django-resized