如何根据某些条件从 django 模型管理界面中止模型实例删除

发布于 2025-01-11 08:51:19 字数 787 浏览 0 评论 0原文

我想根据某些条件从 django admin 中止模型删除。

我尝试重写 delete_queryset(self, request, queryset) 方法。

class MyModelAdmin(ModelAdmin):
    def delete_queryset(self, request, queryset):
        if not MyModel.objects.filter(is_active=True).exists():
            message = "Error message"
            raise ValidationError(message)
        super().delete_queryset(request, queryset)

这是行不通的,因为 django 在这个阶段不处理异常。

在 Django 文档中找到了这个: https://docs.djangoproject.com/en/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_deleted_objects

但我不知道如何从这里重定向到 Django管理页面,其中列出了所有模型实例并向用户显示错误消息。

I want to abort model deletion from django admin based on some condition.

I tried overriding delete_queryset(self, request, queryset) method.

class MyModelAdmin(ModelAdmin):
    def delete_queryset(self, request, queryset):
        if not MyModel.objects.filter(is_active=True).exists():
            message = "Error message"
            raise ValidationError(message)
        super().delete_queryset(request, queryset)

This doesn't work since django does not handles exception at this stage.

Found this in Django documentation: https://docs.djangoproject.com/en/4.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_deleted_objects

But I am not sure how can I redirect from here to Django admin page where all model instances are listed and display the error message to user.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独孤求败 2025-01-18 08:51:19

您可以覆盖 .has_delete_permission(…) 方法 [Django-doc]

class MyModelAdmin(ModelAdmin):
    # …
    
    def has_delete_permission(self, request, obj=None):
        if (my_condition):
            return False
        return super().has_delete_permission(request, obj)

这里 obj 是将要删除的对象已删除。例如,如果您想防止删除 is_activeTrue 的对象,您可以使用:

class MyModelAdmin(ModelAdmin):
    # …
    
    def has_delete_permission(self, request, obj=None):
        if obj is not None and obj.is_active:
            return False
        return super().has_delete_permission(request, obj)

You can override the .has_delete_permission(…) method [Django-doc]:

class MyModelAdmin(ModelAdmin):
    # …
    
    def has_delete_permission(self, request, obj=None):
        if (my_condition):
            return False
        return super().has_delete_permission(request, obj)

Here obj is the object that will be removed. For example if you want to prevent removing an object with is_active is True, you can work with:

class MyModelAdmin(ModelAdmin):
    # …
    
    def has_delete_permission(self, request, obj=None):
        if obj is not None and obj.is_active:
            return False
        return super().has_delete_permission(request, obj)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文