我有这个代码用于删除我的模型,以便删除文件。我还希望它将文件移动到只有管理员才能在删除之前看到的文件夹。
这是我的代码:
@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完成这项工作?这是我做的第一个信号所以我不确定,即使有文档我也无法让它工作。
一个小例子可以创造奇迹,提前谢谢
答案 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)