删除模型时Django删除并移动上传的文件

时间:2015-08-05 21:11:18

标签: python django

我有这个代码用于删除我的模型,以便删除文件。我还希望它将文件移动到只有管理员才能在删除之前看到的文件夹。

这是我的代码:

@receiver(post_delete, sender=ClientUpload)
def clientupload_postdelete(sender, instance, **kwargs):
    if instance.file:
        #with f as open(settings.MEDIA_ROOT + '/uploads/Recycle/' + instance.file.name, 'w+'):
        #   f.write(instance.file)
        #   f.close()
        #   logger = logging.getLogger(__name__)
        #   logger.info("File %s moved to %s" % (instance.file.name, settings.MEDIA_ROOT + '/uploads/Recycle'))
        # Pass false so FileField doesn't save the model.
        instance.file.delete(False)
    else:
        logger = logging.getLogger(__name__)
        logger.warning("Failed to find file %s for deletion." % instance.file.name)

注释掉的部分已被注释掉,因为他们提出了这个错误:
SyntaxError:无法分配给函数调用。在with f as open(...)行。我不确定为什么,但这应该是在删除之前将文件保存到另一个目录的部分。我在这做错了什么?在删除文件之前,如何将文件写入另一个目录?

此处是postdelete正确还是我应该使用prelete?

最后,instance.file.name是在这种情况下获取文件名的正确方法吗?或者只是instance.file完成这项工作?这是我做的第一个信号所以我不确定,即使有文档我也无法让它工作。

一个小例子可以创造奇迹,提前谢谢

1 个答案:

答案 0 :(得分:2)

你到底有什么错误? “SyntaxError:无法分配给函数调用”?因为with语法错误。您正尝试将f分配给open(),反之亦然:

with open(settings.MEDIA_ROOT + '/uploads/Recycle/' + instance.file.name, 'w+') as f:
# ...rest of the code

尝试更改,下次请发布Traceback,以便我们更轻松地进行调试。

至于信号类型:post_delete很好。您获得的实例不再位于数据库中,而是包含您需要的信息(文件)。

关于instance.file.name的问题,今天我希望.name只返回文件名,但事实并非如此。我获取文件名的方式是使用os.path.basename。但在你的情况下,这是不必要的

import os

filename = os.path.basename(instance.file.path)
相关问题