Django 管理员防止删除最后一条记录

Ozz*_*zzy 1 django django-admin

我是 django 的新手,并且不断学习。

我有一个必须有 1 条记录的模型,因此我想防止删除最后一条记录。

模型.py

class SliderContent (models.Model):
    name = models.CharField(max_length=40)
    image = models.ImageField(upload_to='image')
Run Code Online (Sandbox Code Playgroud)

我在 admin.py 中尝试了以下操作

class SliderContentAdmin(admin.ModelAdmin):
.....
    def delete_model(self, request, obj):
     if last_record:
          storage = messages.get_messages(request)
          storage.used = True
          messages.error(request, 'Cannot delete last record.')
     else:
          obj.delete()
Run Code Online (Sandbox Code Playgroud)

这不起作用,我还查看了 pre_delete 接收器,但从我读到的内容来看,这不起作用,因为我正在使用管理视图中的构建。

做这个的最好方式是什么?

Ale*_*zov 5

重写该has_delete_permission()方法:

from django.contrib.admin import helpers

class SliderContentAdmin(admin.ModelAdmin):
    min_objects = 1

    def has_delete_permission(self, request, obj):
        queryset = self.model.objects.all()

        # If we're running the bulk delete action, estimate the number
        # of objects after we delete the selected items
        selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME)
        if selected:
            queryset = queryset.exclude(pk__in=selected)

        if queryset.count() <= self.min_objects:
            message = 'There should be at least {} object(s) left.'
            self.message_user(request, message.format(self.min_objects))
            return False

        return super(SliderContentAdmin, self).has_delete_permission(request, obj)
Run Code Online (Sandbox Code Playgroud)