2017-06-18 27 views
0

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

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

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

这是我的代码。

类照片:

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

写了另外两个功能:

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 
+0

您可以保存它并使用'super()'调用保存它。 –

回答

0

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

0

你可以传递一个parametter像这样保存函数内部:

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

你的问题是,你是PIL.Image被localy保存图像加上在模型DB7你调用它的另一个除了像Lukas Herman所说的那样储存它。 您需要一种将图像存储到ImageField而不使用PIL.Image.save()的方法。这里是我找到的链接:link-stackoverflow 另一个可能的解决方案是使用图像类存储并存储图像并将路径位置保存为CharField或TextField

+0

嗨,莫拉!我已经尝试过这种方法,但没有奏效。 – Xiaohang

+0

我很抱歉,我误解了你的代码我假设img是ImageFIeld,它竟然是PIL.Image,我编辑了我的答案,并提供了一个链接到一个可能的解决方案 – devcodexyz