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

1 投票
2 回答
3293 浏览
提问于 2025-04-16 03:51

我正在尝试在保存图片之前先调整它的大小。我在模型上使用了一个自定义的保存方法,但遇到了一些问题。

这是我现在的代码:

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 个回答

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

1

在你尝试访问 UserImagesImageField 之前,你需要先保存你的 UserImages

这里有一个示例,教你怎么做,可以参考这个代码片段:

简单来说:

super(UserImages, self).save()

另外,你的模型名称应该是单数形式,比如用 UserImage 而不是 UserImages

撰写回答