Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from django.contrib import admin
- class ModelBModelAdmin(admin.ModelAdmin):
- rel_dump = {}
- def delete_view(self, request, object_id, extra_context=None):
- """
- handling deletion from change_form
- """
- obj = models.ModelB.objects.get(pk=object_id)
- self.before_delete(obj)
- res = super(ModelBModelAdmin, self).delete_view(request, object_id, extra_context)
- self.after_delete(obj)
- return res
- def response_action(self, request, queryset):
- """
- handling deletion from change_list
- """
- #copy & pasted from super method:
- try: action_index = int(request.POST.get('index', 0))
- except ValueError: action_index = 0
- try: action = request.POST.getlist('action')[action_index]
- except IndexError: action = ''
- if action == 'delete_selected':
- for obj in queryset:
- self.before_delete(obj)
- res = super(ModelBModelAdmin, self).response_action(request, queryset)
- if action == 'delete_selected':
- for obj in queryset:
- self.after_delete(obj)
- return res
- def before_delete(self, obj):
- """
- removing "problem" relation from _meta._m2m_cache and saving them into rel_dump dictionary to restore at the end.
- consequently it will be ignored during the cascade-deletion of all related objects
- """
- self.rel_dump[obj] = {}
- for key in obj._meta._m2m_cache.keys():
- if isinstance(key, generic.GenericRelation) and key.rel.to == ModelA:
- self.rel_dump[obj].update({key: obj._meta._m2m_cache.pop(key)})
- def after_delete(self, obj):
- """
- restoring relations and manual deletion of related objects
- """
- obj._meta._m2m_cache.update(self.rel_dump.pop(obj))
- ModelA.objects.filter(content_type=ContentType.objects.get_for_model(obj.__class__), object_pk=obj.pk).delete()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement