python - Django:即使删除被阻止,也能成功删除消息

标签 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。

最佳答案

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/

相关文章:

python - Python 事务中的多个查询

python - Django 管理员。以相同的形式创建父级和子级

django - 在标题中隐藏 Django Logo /名称 Django 管理工具

python - Pandas:有没有办法 1)在数据框中的每一行上方添加两个新的空行,以及 2)用相同的值填充行?

python - 如何为特定的 @cache_page 指定 KEY_FUNCTION

python - 大于阈值的元素的 numpy.argmin

django - 如何使用 django 将更新的更改推送到 ec2 实例

python - 如何测量 Django 缓存性能?

python - django 创建自定义表单

javascript - Django/jQuery 在管理中级联选择框