如何在更新ImageField时删除旧图像?
我正在用Django创建一个股票照片网站。在我的模型里有一个图片字段,但问题是当用户更新这个图片字段时,原来的图片文件并没有从硬盘上删除。
我该如何在更新后删除旧的图片呢?
9 个回答
22
在你的模型中使用这个自定义保存方法:
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)
这个方法在我的网站上运行得很好。之前这个问题让我很困扰,我不想为了处理这个问题而写一个清理脚本,因为我更希望一开始就做好记录。如果你在使用中遇到任何问题,请告诉我。
80
使用 django-cleanup 这个工具
pip install django-cleanup
在你的设置文件 settings.py 中进行配置
INSTALLED_APPS = (
...
'django_cleanup.apps.CleanupConfig', # should be placed after your apps
)
23
你需要手动删除旧的图片。
图片的绝对路径保存在 your_image_field.path
里。所以你可以这样做:
os.remove(your_image_field.path)
不过,为了方便起见,你可以使用关联的 FieldFile 对象,这样可以轻松访问底层文件,并且提供了一些方便的方法。具体可以查看 这个链接