在Django admin中,如何防止删除类型的最后一个对象

时间:2012-02-10 09:47:52

标签: django django-admin

有没有办法可以阻止用户删除某种类型的最后一个对象(即表格中的最后一行)?他们仍然应该能够删除那种对象,但必须确保始终至少留下一个条目 - 在这种特殊情况下,至少有一个条目与用户相关联。

我尝试覆盖模型的删除功能:

def delete(self, *args, **kwargs):
    others = Presentation.objects.filter(user=self.user).exclude(pk=self.pk)
    if len(others) < 1:
        pass
    else:
        super(Presentation, self).delete(*args, **kwargs)

这样可行,但是用户被告知删除实际上是成功的。我想要显示一条错误消息,比如验证失败时。但是,据我所知,验证仅适用于保存。

2 个答案:

答案 0 :(得分:2)

你能试试吗?

# admin.py
class MyModelAdmin(admin.ModelAdmin):
    def delete_model(self, request, obj):
         if last_record:
              storage = messages.get_messages(request)
              storage.used = True
              messages.error(request, 'Cannot delete last record.')
         else:
              obj.delete()

另一种选择可能是使用jQuery隐藏成功消息div或span。

答案 1 :(得分:1)

我建议你采用另一种方法:

1)根据您的条件创建并连接信号到pre_delete并引发异常:

def on_delete(sender,**kwargs):
    if <condition>:
        raise Exception('Abort delete')
    #else: continue and delete

pre_delete.connect(on_delete,sender=Presentation)

2)然后,在视图上,您​​可以捕获此异常

# view code...
try:
    object.delete()
except:
    # add the desired info to context

无论如何,您还可以覆盖model::delete以抛出异常并将其捕获到视图代码中。