From 0a9c52e013dede9c765fb2550cdef17caaafdccd Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Fri, 23 Sep 2011 04:22:30 +0000 Subject: [PATCH] Fixed #16917 -- Don't try to use the model name for a ContentType's unicode representation if the model no longer exists. Thanks Ivan Sagalaev for report and patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16895 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/contenttypes/models.py | 6 +++--- django/contrib/contenttypes/tests.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/django/contrib/contenttypes/models.py b/django/contrib/contenttypes/models.py index 2f20797e95..9ab059eaec 100644 --- a/django/contrib/contenttypes/models.py +++ b/django/contrib/contenttypes/models.py @@ -92,11 +92,11 @@ class ContentType(models.Model): # # We return self.name only when users have changed its value from the # initial verbose_name_raw and might rely on it. - meta = self.model_class()._meta - if self.name != meta.verbose_name_raw: + model = self.model_class() + if not model or self.name != model._meta.verbose_name_raw: return self.name else: - return force_unicode(meta.verbose_name) + return force_unicode(model._meta.verbose_name) def model_class(self): "Returns the Python model class for this type of content." diff --git a/django/contrib/contenttypes/tests.py b/django/contrib/contenttypes/tests.py index fd624c3377..fa3878c553 100644 --- a/django/contrib/contenttypes/tests.py +++ b/django/contrib/contenttypes/tests.py @@ -109,3 +109,16 @@ class ContentTypesTests(TestCase): obj = FooWithoutUrl.objects.create(name="john") self.assertRaises(Http404, shortcut, request, user_ct.id, obj.id) + + def test_missing_model(self): + """ + Ensures that displaying content types in admin (or anywhere) doesn't + break on leftover content type records in the DB for which no model + is defined anymore. + """ + ct = ContentType.objects.create( + name = 'Old model', + app_label = 'contenttypes', + model = 'OldModel', + ) + self.assertEqual(unicode(ct), u'Old model')