【发布时间】:2014-12-05 19:57:58
【问题描述】:
当您尝试删除模型实例时,我正在尝试触发一个很好的错误,该错误出现在管理后端。如果我使用以下信号来执行此操作,我的问题是它会引发 500 错误,而不是在表单中发布一个很好的错误消息:
@receiver(models.signals.pre_delete, sender=MyInvincibleModel)
def execute_before_delete(sender, instance, using, *args, **kwargs):
# some logic
raise ValidationError("Nooo, I don't want to die!!")
但是,如果我在模型的 clean 方法中引发 ValidationError,它确实会在表单本身中显示为一个很好的错误消息。这样做的问题是我不知道如何让 clean 方法检查是否正在删除实例。如果我有一个自定义的 ModelForm 设置,我可以这样做:
for cleaned_data in self.cleaned_data:
if cleaned_data.get('DELETE', True):
raise ValidationError("Nooo, I don't want to die!!")
但我想依赖标准的管理表单,并且更愿意避免覆盖可能发生删除的每一个。
我的问题是:我怎样才能使预删除信号引发的验证错误在管理表单中很好地呈现,或者如果失败了,我怎样才能让模型清理方法检测到数据何时被删除?
Django:1.6.1 Python:3.3
【问题讨论】:
-
admin 的删除由单独的视图处理,与你的模型视图的形式无关。更糟糕的是,对于批量删除,信号不会被触发。所以你可能需要覆盖管理员的删除操作。
-
我对此进行了测试,发现我上面概述的信号实际上是在批量删除期间触发的,所以不确定你的意思。我也尝试修改 ModelAdmin.delete_model() 但它生成的错误仍然作为 500 / debug with traceback 而不是很好的消息抛出。如果你想用你的建议写一个答案(并且它有效),我很乐意接受它!
标签: python django django-admin django-signals