2010-05-20 39 views
20

我正在使用Django創建一個股票照片網站,我在我的模型中有一個ImageField,問題是當用戶更新圖像字段時,原始圖像文件不會從硬盤上刪除。如何在更新ImageField時刪除舊圖像?

如何在更新後刪除舊圖像?

回答

13

您必須手動刪除舊圖像。

圖像的絕對路徑存儲在your_image_field.name。所以,你會做這樣的事情:

os.remove(your_image_field.name) 

但是,作爲一種方便,你可以使用相關的FieldFile對象,它可以輕鬆訪問基礎文件,以及提供一些方便的方法。見http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield-and-fieldfile

+0

這不是django ImageField的默認行爲嗎?基於這個職位:http://www.redrobotstudios.com/blog/2010/03/02/dont-delete-image-file-when-deleting-django-model-instance/? – 2012-01-12 14:44:54

+0

OP詢問用ImageField更新模型實例(即用戶上傳新圖像)。在這種情況下,舊圖像不會被刪除。 – 2012-01-17 15:12:37

+0

注意:我不確定自此以後它是否發生了變化,或者如果它略微偏離,但是在1.6中,imgfield.name是相對路徑。 imgfield.file.name具有完整路徑。 – kungphu 2014-03-12 14:41:57

10

使用此自定義的保存方法,在你的模型:

def save(self, *args, **kwargs): 
    try: 
     this = MyModelName.objects.get(id=self.id) 
     if this.MyImageFieldName != self.MyImageFieldName: 
      this.MyImageFieldName.delete() 
    except: pass 
    super(MyModelName, self).save(*args, **kwargs) 

它爲我在我的網站。這個問題也困擾着我,我不想在第一時間做一個清理腳本而不是優質簿記。讓我知道是否有任何問題。

+8

您可能想要使用:'this.MyImageFieldName.delete(save = False)'因爲我已經看到了delete()遞歸調用'MyModelName'模型的'保存',要小心......並測試打印在保存方法中 – 2011-11-23 23:38:38

+1

刪除自己的模型後刪除文件也更好。如果因爲任何原因刪除模型失敗,您不想丟失該文件。 – Reza 2017-09-13 19:08:01

12

使用django-cleanup

pip install django-cleanup 

settings.py

INSTALLED_APPS = (
    ... 
    'django_cleanup', # should go after your apps 

) 
2

這裏是一個應用程序,默認刪除孤立文件:django-smartfields。 它將刪除文件每當:

  • 字段值用一個新的替換(或者上載或手動設定)
  • 字段是通過形式清除(在情況下,不需要該字段,當然)
  • 包含字段的模型實例本身被刪除。

有可能把這一清理功能關閉使用的參數:ImageField(keep_orphans=True)每場爲基礎,或者在全球範圍內設置SMARTFIELDS_KEEP_ORPHANS = True

from django.db import models 

from smartfields import fields 

class MyModel(models.Model): 
    image = fields.ImageField() 
    document = fields.FileField() 
相關問題