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



有没有办法防止用户删除某个类型的最后一个对象(即表中的最后一行)?通常情况下,他们仍然可以删除这类对象,但必须确保始终至少剩下一个条目——在这种特殊情况下,至少有一个条目与用户相关。

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

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)

这是有效的,但用户被告知删除实际上是成功的。我希望显示一条错误消息,就像验证失败时一样。不过,据我所知,验证只适用于保存。

你也可以试试这个吗?

# 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) 创建并连接一个信号以预删除并根据您的条件引发和异常:

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来抛出异常并在视图代码中捕获它。

相关内容

最新更新