有一个类似的问题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 图像的路径。如果我在之前删除它我用新图像更新它,我冒险可能保存失败然后我最终没有图像。我可以使用保存后信号的组合吗?任何建议都会有所帮助。
答案 0 :(得分:6)
作为seen in this answer,"有一个应用程序用于":django-cleanup。
如果您希望自己实现它,那么在评论中链接的@raphv问题的接受答案会给出一些好的指示。
更新后续更改的良好解决方案是使用模型信号;我倾向于使用post_init
和post_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',#应该放在您的应用程序之后 ... )