Django模型:delete()未触发 [英] Django model: delete() not triggered
问题描述
我有一个模型:
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’sdelete()
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屋!