我正在使用Django創建一個股票照片網站,我在我的模型中有一個ImageField,問題是當用戶更新圖像字段時,原始圖像文件不會從硬盤上刪除。如何在更新ImageField時刪除舊圖像?
如何在更新後刪除舊圖像?
我正在使用Django創建一個股票照片網站,我在我的模型中有一個ImageField,問題是當用戶更新圖像字段時,原始圖像文件不會從硬盤上刪除。如何在更新ImageField時刪除舊圖像?
如何在更新後刪除舊圖像?
您必須手動刪除舊圖像。
圖像的絕對路徑存儲在your_image_field.name
。所以,你會做這樣的事情:
os.remove(your_image_field.name)
但是,作爲一種方便,你可以使用相關的FieldFile對象,它可以輕鬆訪問基礎文件,以及提供一些方便的方法。見http://docs.djangoproject.com/en/dev/ref/models/fields/#filefield-and-fieldfile
使用此自定義的保存方法,在你的模型:
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)
它爲我在我的網站。這個問題也困擾着我,我不想在第一時間做一個清理腳本而不是優質簿記。讓我知道是否有任何問題。
您可能想要使用:'this.MyImageFieldName.delete(save = False)'因爲我已經看到了delete()遞歸調用'MyModelName'模型的'保存',要小心......並測試打印在保存方法中 – 2011-11-23 23:38:38
刪除自己的模型後刪除文件也更好。如果因爲任何原因刪除模型失敗,您不想丟失該文件。 – Reza 2017-09-13 19:08:01
pip install django-cleanup
settings.py
INSTALLED_APPS = (
...
'django_cleanup', # should go after your apps
)
之前更新模型實例,您可以使用FileField
對象的刪除方法。例如,如果FileField
或ImageField
被命名爲photo
和模型實例profile
,那麼下面就從磁盤
profile.photo.delete(False)
刪除該文件詳細說明,這裏是Django的文檔
這裏是一個應用程序,默認刪除孤立文件: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()
這不是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
OP詢問用ImageField更新模型實例(即用戶上傳新圖像)。在這種情況下,舊圖像不會被刪除。 – 2012-01-17 15:12:37
注意:我不確定自此以後它是否發生了變化,或者如果它略微偏離,但是在1.6中,imgfield.name是相對路徑。 imgfield.file.name具有完整路徑。 – kungphu 2014-03-12 14:41:57