【问题标题】:Rendering ValidationError from pre_delete signal in admin form?以管理员形式从 pre_delete 信号渲染 ValidationError?
【发布时间】: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


【解决方案1】:

事实证明,这比原本应该做的要困难得多,但我通过覆盖 ModelAdmin.delete_model(以防用户通过超链接访问对象的单个实例)和 delete_selected 操作(以防用户尝试使用 change_list 删除)并将我的逻辑放在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2011-07-15
    • 1970-01-01
    • 2020-08-12
    • 2014-06-25
    • 2017-08-04
    相关资源
    最近更新 更多