我正在尝试在保存之前调整图像大小。我在模型上使用自定义保存方法,但我遇到了麻烦。
这是我现在的代码:
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)
此操作失败并告诉我无法找到该文件。据我所知,这与图像到目前为止只存在于内存中的事实有关,因此无法像这样打开。
所以我的问题是:如何从内存中打开图像并将其保存回内存,以便默认的保存方法可以用它来做它的事情?
非常感谢任何帮助,这让我起了作用:)
答案 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