Django模型:delete()未触发 [英] Django model: delete() not triggered

查看:173
本文介绍了Django模型:delete()未触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个模型:

  class MyModel(models.Model):
...
def save(self):
打印save
...
def delete(self):
打印删除
...
() - 方法被触发,但是delete()不是这样的:b

我使用最新的svn-Version(Django 1.2版pre-alpha SVN-11593),并且关于 http://www.djangoproject.com/documentation/models/save_delete_hooks/ 这应该工作。
任何想法?

解决方案

我想你可能正在使用管理员的批量删除功能,事实上,管理员的批量删除方法不调用 delete()(请参阅相关的)。



过去,我已经写了一个自定义的管理操作来删除模型。 >

如果您不使用管理员的批量删除方法(例如,您点击对象编辑页面上的删除按钮),则会出现其他事情。



请参阅警告这里


删除所选对象操作
使用 QuerySet.delete()为效率
的原因,其中有一个重要的
警告:您的模型的 delete()方法
将不会被调用。



如果要覆盖此行为,
只需编写一个自定义操作,

中完成删除首选方式 - 例如

所选项目调用 Model.delete()



有关批量删除的更多背景信息,
请参阅对象
删除


我的自定义管理模型看起来如下所示:

  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 (请求)
del action ['delete_selected']
返回a ctions

def really_delete_selected(self,request,queryset):
for obj in queryset:
obj.delete()

如果queryset.count( )== 1:
message_bit =1 photoblog entry was
else:
message_bit =%s photoblog entries were%queryset.count()
self.message_user(请求,%s成功删除。%message_bit)
really_delete_selected.short_description =删除所选条目

admin.site.register(PhotoBlogEntry,PhotoBlogEntryAdmin)


I have a model:

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

The save()-Method is triggered, but the delete() is not. I use the latest svn-Version (Django version 1.2 pre-alpha SVN-11593), and concerning the documentation at http://www.djangoproject.com/documentation/models/save_delete_hooks/ this should work. Any ideas?

解决方案

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)

这篇关于Django模型:delete()未触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆