【问题标题】:Why does Django save pictures twice?为什么Django会保存两次图片?
【发布时间】:2023-03-31 04:10:01
【问题描述】:

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

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

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

这是我的代码。

班级合影:

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)

我在Photo课上写的保存函数

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()

还有另外两个函数:

def get_img_filename(self, img):
    return img.path

def get_img_thumb_filename(self, img):
    img_pre, img_ext = os.path.splitext(img.path)
    thumb_name = img_pre + '_thumb' + img_ext
    return thumb_name

【问题讨论】:

  • 您保存它,您的super() 调用也会保存它。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以像这样在保存函数中传递一个参数:

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

    您的问题是您是 PIL.Image 正在将图像保存在本地,并且在 Model Db 中您​​将其称为另一种保存方式,就像 Lukas Herman 所说的那样将其存储在本地。 您需要一种无需使用 PIL.Image.save() 即可将 Image 存储到 ImageField 中的方法。这是我找到的链接:link-stackoverflow 另一种可能的解决方案是使用 Image Class 存储并存储图像并将路径位置保存到 CharField 或 TextField

    【讨论】:

    • 嗨,莫拉德!这个方法我试过了,还是不行。
    • 很抱歉,我误读了您的代码,我认为 img 是 ImageFIeld,结果是 PIL.Image,我编辑了答案并附上了可能解决方案的链接
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 2015-06-06
    • 2019-10-06
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多