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

时间:2016-07-06 19:46:50

标签: django django-models

有一个类似的问题here但是来自2011和Django 1.2。从那时起,许多事情发生了变化我正在使用Django 1.9。

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

class CartaMagicPy(models.Model):
    imagen = models.ImageField(null=True, upload_to=ubicar_magicpy)

第一时间,图像被保存。但是,然后,用户裁剪图像,并获得分配给相同ImageField的新图像。

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

3 个答案:

答案 0 :(得分:6)

作为seen in this answer,"有一个应用程序用于":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)

这通常似乎是上面链接包的功能,加上一些额外的安全检查和清理。

答案 1 :(得分:0)

我们可以使用以下代码优化图像是否接受空值。

@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.imagen:
            if instance._current_imagen_file != instance.imagen.path:
                instance._current_imagen_file.delete(save=False)
        else:
            if instance._current_imagen_file:
                instance._current_imagen_file.delete()

答案 2 :(得分:0)

我不确定,但是您可以尝试

使用Django-cleanup

pip安装django-cleanup

settings.py

INSTALLED_APPS =(     ...     'django_cleanup',#应该放在您的应用程序之后     ... )