如何在更新ImageField时删除旧图像?

49 投票
9 回答
39464 浏览
提问于 2025-04-15 22:57

我正在用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 对象,这样可以轻松访问底层文件,并且提供了一些方便的方法。具体可以查看 这个链接

撰写回答