How to delete old image when update ImageField?

前端 未结 8 1574
被撕碎了的回忆
被撕碎了的回忆 2020-12-13 09:20

I\'m using Django to create a stock photo site, I have an ImageField in my model, the problem is that when the user updates the image field, the original image file isn\'t d

8条回答
  •  粉色の甜心
    2020-12-13 09:33

    You can define pre_save reciever in models:

    @receiver(models.signals.pre_save, sender=UserAccount)
    def delete_file_on_change_extension(sender, instance, **kwargs):
        if instance.pk:
            try:
                old_avatar = UserAccount.objects.get(pk=instance.pk).avatar
            except UserAccount.DoesNotExist:
                return
            else:
                new_avatar = instance.avatar
                if old_avatar and old_avatar.url != new_avatar.url:
                    old_avatar.delete(save=False)
    

    My avatrs has unique url for each person like "avatars/ceb47779-8833-4719-8711-6f4e5cabb2b2.png". If user upload new image with different extension like jpg, delete_file_on_change_extension reciever remove old image, before save new with url "avatars/ceb47779-8833-4719-8711-6f4e5cabb2b2.jpg" (in this case). If user uploads new image with same extension django overwrite old image on storage (disk), because images paths are the same. This works fine with AWS S3 django-storage.

提交回复
热议问题