class SomeModel(models.Model):
end = models.DateTimeField()
def delete(self, *args, **kwargs):
now = datetime.datetime.now()
if self.end < now:
return # past events cannot be deleted
super(SomeModel, self).delete(self, *args, **kwargs)
我在我的一个模型中写过上面的代码。 它工作得很漂亮,但只有一个问题:
我收到一条消息说,即使该模型未被删除,对象也会被成功删除,因为如果我放入的条件。
在这种情况下,有没有办法可以发送一条消息,即对象没有被删除?
注意:此型号仅适用于django-admin。
答案 0 :(得分:2)
django admin中的删除视图不检查delete()
调用是否成功,因此如果要覆盖问题中的删除方法,则需要覆盖整个{{ 3}}方法。
如果SomeModel
仅用于Django管理员,则另一种可能的方法是覆盖ModelAdmin.delete_view
方法。这将删除更改视图中的删除链接,并禁用过去事件的删除页面。
class SomeModelAdmin(admin.ModelAdmin):
...
def has_delete_permission(self, request, obj=None):
"""
Return False for events in the past
"""
if obj is None:
# obj is None in the model admin changelist view
return False
now = datetime.datetime.now()
if obj.end < now:
return False # past events cannot be deleted
else:
return super(SomeModelAdmin, self).has_delete_permission(request, obj)
上面的实现将禁用“删除所选对象”has_delete_permission
,因为当obj为None时返回False。你应该考虑这样做,因为它调用queryset delete方法而不是你重写的删除方法。
使用这种方法,superadmins仍然可以删除具有所有权限的事件。如果SomeModel
出现在模型内联中,我认为这种方法不会起作用 - 尽管我在Django 1.4中看到has_delete_permission
是InlineModelAdmin
选项。
答案 1 :(得分:0)
您可以从覆盖的delete()中返回True或False,只需使用表单中的值来构建消息。
def delete(self, *args, **kwargs):
now = datetime.datetime.now()
if self.end < now:
return False # past events cannot be deleted
super(SomeModel, self).delete(self, *args, **kwargs)
return True #successfully deleted from the database