2017-06-18 26 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