【Django】Admin后台删除文件同时, 删除服务器上文件


  1. 导入包
import os
from django.db.models.signals import post_delete
from django.dispatch import receiver
from django.conf import settings
  1. 模型
class AffixFile(models.Model):
    """
    附件表
    """
    task = models.ForeignKey('Task', on_delete=models.CASCADE, verbose_name='关联所属任务')
    file = models.FileField(upload_to=upload_to, null=True)
    affix_type = (('0', '图片'), ('1', '视频'))
    type = models.CharField('附件类型', max_length=32, choices=affix_type, default='0')
    publish_time = models.DateTimeField('上传时间', auto_now_add=True)

    def __str__(self):
        return str(self.pk) + '_' + self.type + '(' + str(self.task_id) + ')'

    class Meta:
        verbose_name = '附件表'
        verbose_name_plural = verbose_name
  1. 在models.py文件中添加监听器
# 添加监听器, 当admin后端删除文件对象时, 服务器文件一并删除
@receiver(post_delete, sender=AffixFile)  # sender=模型类名
def delete_upload_files(sender, instance, **kwargs):
    files = getattr(instance, 'file')  # 文件对象 字段名
    if not files:
        return
    file_name = os.path.join(settings.MEDIA_ROOT, str(files))
    if os.path.isfile(file_name):
        os.remove(file_name)