如何取消django信号中的删除

gin*_*nad 12 django django-signals

有没有办法使用django pre_delete信号取消删除记录?

例:

def on_delete(sender,**kwargs):
  if not <some condition>:
    #cancel the deletion
 # else continue with the deletion
pre_delete.connect(on_delete,sender=MyModel)
Run Code Online (Sandbox Code Playgroud)

另一个问题是有一种方式可以对模型说" 在更改文件之前先删除原始文件 ",因为现在这就是我所做的(见下面的代码),我不确定这是否是最好的方式做到这一点.

def on_save(sender,**kwargs):
  obj = kwargs['instance']
  try:
    id = obj.pk
    # find the file
    original_file = sender.objects.get(pk=id)
    # delete the original file before uploading a new file
    original_file.file.delete()
  except ....

pre_save.connect(on_save,sender=ModelWithFileUpload)
Run Code Online (Sandbox Code Playgroud)

(在django 1.2中,他们会在更改或删除时自动删除文件但在django 1.3中他们删除了此功能)

提前致谢

sha*_*dfc 1

使用内置 Django 信号时这是不可能的。信号上的“send()”和“send_robust()”方法返回一个二元组列表——(接收器,响应)。因此,如果您有正确的代码来处理来自每个接收器的响应,则您可能可以根据一个信号处理程序的返回值来阻止某些操作。

contrib.comments 应用程序执行此操作,允许任何返回 False 的接收器“取消”信号操作。参见第 111-120 行

然而,发出 pre_delete、pre_save 等信号的核心 Django 代码没有任何这种特殊处理。所有这些信号的作用都是通知接收者发生了一些事情。