为什么Django会两次保存图片?

时间:2017-06-18 20:03:36

标签: python django python-3.x python-imaging-library

我正在尝试覆盖保存功能。我想要的是将原始照片的大小调整为默认大小(800 * 534),然后为此图片生成缩略图。但是,我发现照片存储了两次。

例如,我第一次添加了一张名为sample.jpg的照片。我的指示有三张照片。一个是../Media/photos/,其他的是../Media/。当我再次保存这张照片时,有四张照片。两个在.../Media/photos/,其他在../ Media /.

我真的很困惑为什么Django将图片存储两次以及为什么我的图片存储在../Media而不是../Media/photos中。我想要的只是在../Media/photos中制作800 * 534图片及其缩略图的两张图片。

这是我的代码。

班级照片:

Two.Id

我在课堂上写的保存功能

class Photo(models.Model):
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250)
    summary = models.TextField(blank=True)
    created_date = models.DateField(auto_now_add=True)
    modified_date = models.DateField(auto_now=True)
    image = models.ImageField(upload_to='photo/')
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    is_cover_photo = models.BooleanField(default=False)

另外两个功能:

def save(self):
    if not self.pk:
        filename = self.image
        if filename:
            print(filename)
            img = Image.open(filename)
            # save the default size photo
            default_size = (800, 534)
            img.thumbnail(default_size, Image.ANTIALIAS)
            img.save(self.get_img_filename(filename))

            # save thumbnail photo
            cover_size = (342, 229)
            img.thumbnail(cover_size, Image.ANTIALIAS)
            img.save(self.get_img_thumb_filename(filename))
    super(Photo, self).save()

2 个答案:

答案 0 :(得分:0)

这是因为您的程序仍在调用超类的保存方法,该方法隐式保存所有字段,包括" image"。因此,您的服务器中存在重复的图像。

答案 1 :(得分:0)

你可以在保存函数中传递一个参数,如下所示:

img.save(self.get_img_filename(filename), save=False)

<击> 你的问题是你是PIL.Image正在保存图像localy plus在你称之为模型Db的另一个存储,就像Lukas Herman所说的那样存储它。 你需要一种方法将Image存储到ImageField中而不使用PIL.Image.save()。这是我找到的链接:link-stackoverflow 另一个可行解决方案是使用Image Class存储并存储图像并将路径位置保存到CharField或TextField