需求
使用ImageField字段,想在上传新的图片之前删除文件中旧的图片。
实现
1.models中导入两个库,新建一个函数
两个库:
from django.db.models.signals import pre_delete
from django.dispatch import receiver
带有图片上传的模型类:
class Student(models.Model):
.....
student_portrait = models.ImageField(upload_to="portrait", verbose_name="头像")
...
新建一个函数:
@receiver(pre_delete, sender=Student) #sender ImageField字段所在的类
def file_delete(instance, **kwargs):
# 设置True,删除之后保存模型,设置Fasle删除之后不保存模型,view中还可继续其它操作
instance.~~~.delete(True) # ~~~=类中imageField目标字段
2.views中导入模型和新建函数进行使用
file_delete(instance=Student.objects.get(id=1))
使用总结
- 其它使用方法:文件类型一样可以生效
- 局限性:只适合更新操作,如果获取的instance不存在就很麻烦。假如再加一句判断获取实例是否存在的语句又显得太不优雅,这么做的话,可能需要至少三条models语句才能完成图片的更新。