diff --git a/django/contrib/admin/util.py b/django/contrib/admin/util.py
index 6a585b2..82c577c 100644
--- a/django/contrib/admin/util.py
+++ b/django/contrib/admin/util.py
@@ -57,10 +57,10 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_
opts_seen = []
for related in opts.get_all_related_objects():
has_admin = related.model in admin_site._registry
- if related.opts in opts_seen:
- continue
- opts_seen.append(related.opts)
rel_opts_name = related.get_accessor_name()
+ if rel_opts_name in opts_seen:
+ continue
+ opts_seen.append(rel_opts_name)
if isinstance(related.field.rel, models.OneToOneRel):
try:
sub_obj = getattr(obj, rel_opts_name)
@@ -106,10 +106,10 @@ def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_
perms_needed.add(related.opts.verbose_name)
for related in opts.get_all_related_many_to_many_objects():
has_admin = related.model in admin_site._registry
- if related.opts in opts_seen:
- continue
- opts_seen.append(related.opts)
rel_opts_name = related.get_accessor_name()
+ if rel_opts_name in opts_seen:
+ continue
+ opts_seen.append(rel_opts_name)
has_related_objs = False
# related.get_accessor_name() could return None for symmetrical relationships
diff --git a/tests/regressiontests/admin_views/fixtures/deleted-objects.xml b/tests/regressiontests/admin_views/fixtures/deleted-objects.xml
new file mode 100644
index 0000000..a82cfe1
--- /dev/null
+++ b/tests/regressiontests/admin_views/fixtures/deleted-objects.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py
index a8fc946..97db930 100644
--- a/tests/regressiontests/admin_views/models.py
+++ b/tests/regressiontests/admin_views/models.py
@@ -59,7 +59,23 @@ class ModelWithStringPrimaryKey(models.Model):
def __unicode__(self):
return self.id
+class Villain(models.Model):
+ name = models.CharField(max_length=100)
+
+ def __unicode__(self):
+ return self.name
+
+class Plot(models.Model):
+ name = models.CharField(max_length=100)
+ team_leader = models.ForeignKey(Villain, related_name='lead_plots')
+ contact = models.ForeignKey(Villain, related_name='contact_plots')
+
+ def __unicode__(self):
+ return self.name
+
admin.site.register(Article, ArticleAdmin)
admin.site.register(CustomArticle, CustomArticleAdmin)
admin.site.register(Section)
admin.site.register(ModelWithStringPrimaryKey)
+admin.site.register(Villain)
+admin.site.register(Plot)
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index c7a8a2e..ebdea4d 100644
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -363,3 +363,19 @@ class AdminViewStringPrimaryKeyTest(TestCase):
response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/delete/' % quote(self.pk))
should_contain = """%s""" % (quote(self.pk), escape(self.pk))
self.assertContains(response, should_contain)
+
+class AdminViewDeletedObjectsTest(TestCase):
+ fixtures = ['admin-views-users.xml', 'deleted-objects.xml']
+
+ def setUp(self):
+ self.client.login(username='super', password='secret')
+
+ def tearDown(self):
+ self.client.logout()
+
+ def test_deleted_objects(self):
+ should_contain = """
Plot: World Domination"""
+ response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(1))
+ self.assertContains(response, should_contain)
+ response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(2))
+ self.assertContains(response, should_contain)