有没有办法防止用户删除某个类型的最后一个对象(即表中的最后一行)?通常情况下,他们仍然可以删除这类对象,但必须确保始终至少剩下一个条目——在这种特殊情况下,至少有一个条目与用户相关。
我试图覆盖模型的删除功能:
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
来抛出异常并在视图代码中捕获它。