Django在更新文件后正确删除图像

Ale*_*lla 3 django django-models

这里有一个类似的问题,但是从2011年和Django 1.2开始.从那时起,许多事情发生了变化 我正在使用Django 1.9.

我想知道我该如何正确地做到这一点,没有任何搞乱文件系统的风险.我有ImageField一个模型:

class CartaMagicPy(models.Model):
    imagen = models.ImageField(null=True, upload_to=ubicar_magicpy)
Run Code Online (Sandbox Code Playgroud)

在第一时刻,图像被保存.但是,然后,用户裁剪图像,并获得分配给它的新图像ImageField.

旧图像不会从文件系统中删除.我该如何删除它?问题是model_object.imagen.path更新后包含图像的路径.如果我用新图像更新它之前删除它,我冒险可能保存失败然后我最终没有图像.我可以使用保存后信号的组合吗?任何建议都会有帮助.

tut*_*uju 6

正如在这个答案中看到的那样,"有一个应用程序":django-cleanup.

如果您更喜欢自己实现它,那么在评论中链接的@raphv问题的接受答案给出了一些很好的指示.

更新后续更改的一个好方法是使用模型信号; 我倾向于使用post_initpost_save,在这种情况下删除旧的图像文件的变化已经取得进展.像这样的东西:

from django.db.models.signals import post_init, post_save
from django.dispatch import receiver

from myapp.models import CartaMagicPy


@receiver(post_init, sender= CartaMagicPy)
def backup_image_path(sender, instance, **kwargs):
    instance._current_imagen_file = instance.imagen


@receiver(post_save, sender= CartaMagicPy)
def delete_old_image(sender, instance, **kwargs):
    if hasattr(instance, '_current_imagen_file'):
        if instance._current_imagen_file != instance.imagen.path:
            instance._current_imagen_file.delete(save=False)
Run Code Online (Sandbox Code Playgroud)

这通常似乎是上面链接的包,以及一些额外的安全检查和清理.