Django model: delete() not triggered

后端 未结 5 1291
盖世英雄少女心
盖世英雄少女心 2020-11-29 23:59

I have a model:

class MyModel(models.Model):
 ...
    def save(self):
        print \"saving\"
        ...
    def delete(self):
        print \"deleting\"
          


        
5条回答
  •  無奈伤痛
    2020-11-30 00:40

    I think you're probably using the admin's bulk delete feature, and are running into the fact that the admin's bulk delete method doesn't call delete() (see the related ticket).

    I've got round this in the past by writing a custom admin action for deleting models.

    If you're not using the admin's bulk delete method (e.g. you're clicking the delete button on the object's edit page) then something else is going on.

    See the warning here:

    The “delete selected objects” action uses QuerySet.delete() for efficiency reasons, which has an important caveat: your model’s delete() method will not be called.

    If you wish to override this behavior, simply write a custom action which accomplishes deletion in your preferred manner – for example, by calling Model.delete() for each of the selected items.

    For more background on bulk deletion, see the documentation on object deletion.

    My custom admin model looks like this:

    from photoblog.models import PhotoBlogEntry
    from django.contrib import admin    
    
    class PhotoBlogEntryAdmin(admin.ModelAdmin):
        actions=['really_delete_selected']
    
        def get_actions(self, request):
            actions = super(PhotoBlogEntryAdmin, self).get_actions(request)
            del actions['delete_selected']
            return actions
    
        def really_delete_selected(self, request, queryset):
            for obj in queryset:
                obj.delete()
    
            if queryset.count() == 1:
                message_bit = "1 photoblog entry was"
            else:
                message_bit = "%s photoblog entries were" % queryset.count()
            self.message_user(request, "%s successfully deleted." % message_bit)
        really_delete_selected.short_description = "Delete selected entries"
    
    admin.site.register(PhotoBlogEntry, PhotoBlogEntryAdmin)
    

提交回复
热议问题