有没有办法可以阻止用户删除某种类型的最后一个对象(即表格中的最后一行)?他们仍然应该能够删除那种对象,但必须确保始终至少留下一个条目 - 在这种特殊情况下,至少有一个条目与用户相关联。
我尝试覆盖模型的删除功能:
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)
这样可行,但是用户被告知删除实际上是成功的。我想要显示一条错误消息,比如验证失败时。但是,据我所知,验证仅适用于保存。
答案 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
以抛出异常并将其捕获到视图代码中。