#16913: Admin error when trying to delete object with a GenericRelation
-------------------+-------------------------------
Reporter: r1cky | Owner: nobody
Type: Bug | Status: new
Milestone: | Component: contrib.admin
Version: 1.3 | Severity: Normal
Keywords: | Triage Stage: Unreviewed
Has patch: 1 | Easy pickings: 0
UI/UX: 0 |
-------------------+-------------------------------
If you have a model A with a GenericForeignKey and a model B with a
GenericRelation to A:
{{{
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.db import models
class ModelA(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type',
'object_id')
class ModelB(models.Model):
model_a = generic.GenericRelation(ModelA, related_name='my_related')
}}}
Create a ModelA and a related Model B:
{{{
b = ModelB.objects.create()
a = b.model_a.create()
}}}
Then try to delete B in the admin and you get a 500:
{{{
Traceback:
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/core/handlers/base.py" in get_response
111. response = callback(request,
*callback_args, **callback_kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/contrib/admin/options.py" in wrapper
328. return self.admin_site.admin_view(view)(*args,
**kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/utils/decorators.py" in _wrapped_view
91. response = view_func(request, *args, **kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/views/decorators/cache.py" in _wrapped_view_func
88. response = view_func(request, *args, **kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/contrib/admin/sites.py" in inner
192. return view(request, *args, **kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/utils/decorators.py" in _wrapper
25. return bound_func(*args, **kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/utils/decorators.py" in _wrapped_view
91. response = view_func(request, *args, **kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/utils/decorators.py" in bound_func
21. return func(self, *args2, **kwargs2)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/db/transaction.py" in inner
209. return func(*args, **kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/contrib/admin/options.py" in delete_view
1255. [obj], opts, request.user, self.admin_site, using)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/contrib/admin/util.py" in get_deleted_objects
76. collector.collect(objs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/contrib/admin/util.py" in collect
127. return super(NestedObjects, self).collect(objs,
source_attr=source_attr, **kwargs)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/db/models/deletion.py" in collect
180. nullable=True)
File "/Users/rlr/.virtualenvs/django/lib/python2.6/site-
packages/django/contrib/admin/util.py" in collect
123. self.add_edge(getattr(obj, source_attr), obj)
Exception Type: AttributeError at /admin/testapp/modelb/1/delete/
Exception Value: 'ModelA' object has no attribute 'my_related'
}}}
It looks like Generic Relations don't add the reverse manager to the
related model (not sure if that is a bug or a feauture?) but the
NestedObjects collector assumes that it will be there.
I added created a test that reproduces the issue and a potential fix:
https://github.com/rlr/django/commit/8d147677fc
--
Ticket URL: <https://code.djangoproject.com/ticket/16913>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.