以admin形式从pre_delete信号渲染ValidationError?

时间:2014-10-10 15:31:42

标签: python django django-admin django-signals

当您尝试删除模型实例时,我试图触发管理员后端中出现的错误。如果我使用以下信号来执行此操作,我的问题是它会抛出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!!")

但是,如果我在模型的干净方法中引发ValidationError,它在表单本身中显示为一个很好的错误消息。这样做的问题是我不知道如何检查清理方法以查看是否正在删除实例。如果我有一个自定义的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

1 个答案:

答案 0 :(得分:0)

事实证明这比以前要困难得多,但我通过覆盖ModelAdmin.delete_model(如果用户通过超链接访问了对象的单个实例)和delete_selected操作找到了解决方案(如果用户尝试使用change_list删除并将我的逻辑放在那里。