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。
最佳答案
django 管理中的删除 View 不会检查 delete()
调用是否成功,因此如果您想像问题中那样覆盖删除方法,则需要覆盖整个 ModelAdmin.delete_view
方法。
如果 SomeModel
仅在 Django 管理中使用,另一种可能的方法是覆盖 has_delete_permission
方法。这将从更改 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)
上面的实现将禁用“删除所选对象”admin action ,因为当 obj 为 None 时我们返回 False。无论如何,您应该考虑这样做,因为它调用查询集删除方法,而不是您重写的删除方法。
通过这种方法, super 管理员仍然能够删除事件,因为他们拥有所有权限。如果 SomeModel
出现在模型内联中,我认为这种方法不起作用 - 尽管我看到 has_delete_permission
是 Django 1.4 中的 InlineModelAdmin
选项.
关于python - Django:即使删除被阻止,也能成功删除消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9263980/