2016-09-19 32 views
3

我剛剛成功地實施類似賈爾斯建議保存新圖像與模型的主鍵的文件名這裏的一個方法: https://stackoverflow.com/a/16574947/5884437如何刪除現有的文件用戶上傳,當一個新的

使用的實際代碼:

class Asset(models.Model): 
    asset_id = models.AutoField(primary_key=True) 
    asset_image = models.ImageField(upload_to = 'images/temp', max_length=255, null=True, blank=True) 

    def save(self, *args, **kwargs): 
     # Call save first, to create a primary key 
     super(Asset, self).save(*args, **kwargs) 

     asset_image = self.asset_image 
     if asset_image: 
      # Create new filename, using primary key and file extension 
      oldfile = self.asset_image.name 
      dot = oldfile.rfind('.') 
      newfile = 'images/' + str(self.pk) + oldfile[dot:] 

      # Create new file and remove old one 
      if newfile != oldfile: 
       self.asset_image.storage.delete(newfile) 
       self.asset_image.storage.save(newfile, asset_image) 
       self.asset_image.name = newfile 
       self.asset_image.close() 
       self.asset_image.storage.delete(oldfile) 

     # Save again to keep changes 
     super(Asset, self).save(*args, **kwargs) 

    def __str__(self): 
     return self.asset_description 

eg用戶在空白的「新資產」表單上提交「MyPicture.jpg」。服務器首先預先保存新資產以生成(asset_id)主鍵,然後將文件重命名爲[asset_id]。[original_extension](例如「26.jpg」)並將其移至正確的文件夾。

不幸的是,我剛剛發現這並沒有考慮具有不同擴展名的文件,例如用戶首先上傳圖片,該圖片被重命名爲「26.jpg」,但是當用戶上傳具有不同擴展名(例如「.png」)的該資源的新圖像時,「26.jpg」&「26.png 「將彼此並存。

如何更改此選項,以便在爲該資產/主鍵上載新映像時始終刪除現有映像?

回答

2

您可以嘗試刪除舊的圖像時它好好嘗試匹配新sumbitted圖像:

class Asset(models.Model): 
    asset_id = models.AutoField(primary_key=True) 
    asset_image = models.ImageField(upload_to = 'images/temp', max_length=255, null=True, blank=True) 

    def save(self, *args, **kwargs): 
     # Delete the old image 
     try: 
      asset = Asset.objects.get(id=self.id) 
      if asset.asset_image and self.image and asset.asset_image != self.image: 
       # Delete the old file if it doesn't match the newly submitted one 
       asset.asset_image.delete(save=False); 
     except Asset.DoesNotExist: 
      # Do nothing when a new image is submitted 
      pass 
     # Call save first, to create a primary key 
     super(Asset, self).save(*args, **kwargs) 
     ... 

一個更好的解決方案可能是看一看django-cleanup自動刪除文件的FileField,ImageField的和子類。它將刪除模型刪除或新文件更新時的舊文件。

+0

只是爲了學習經驗,我試圖根據您的代碼推薦我自己的代碼,但我剛剛嘗試過Django清理,它的工作非常出色,我只是要去堅持下去! 感謝您的建議! – TimJ

相關問題