Django:即使删除被删除,也会成功删除邮件

时间:2012-02-13 16:21:23

标签: python django django-admin

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。

2 个答案:

答案 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_permissionInlineModelAdmin选项。

答案 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