From 12bd7bcb35703c2d2d19f6b79140d727ddee6e5f Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Wed, 23 Feb 2011 13:43:21 +0000 Subject: [PATCH] Fixed #12004 -- Improved error reporting when an abstract class is registered with the admin. Thanks to Matt Smalley for the report, and to mk and Julien Phalip for the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@15636 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/sites.py | 6 ++++++ tests/regressiontests/admin_registration/models.py | 6 +++++- tests/regressiontests/admin_registration/tests.py | 11 +++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index c1f6970193903..4585627a0b08c 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -61,6 +61,8 @@ def register(self, model_or_iterable, admin_class=None, **options): they'll be applied as options to the admin class. If a model is already registered, this will raise AlreadyRegistered. + + If a model is abstract, this will raise ImproperlyConfigured. """ if not admin_class: admin_class = ModelAdmin @@ -74,6 +76,10 @@ def register(self, model_or_iterable, admin_class=None, **options): if isinstance(model_or_iterable, ModelBase): model_or_iterable = [model_or_iterable] for model in model_or_iterable: + if model._meta.abstract: + raise ImproperlyConfigured('The model %s is abstract, so it ' + 'cannot be registered with admin.' % model.__name__) + if model in self._registry: raise AlreadyRegistered('The model %s is already registered' % model.__name__) diff --git a/tests/regressiontests/admin_registration/models.py b/tests/regressiontests/admin_registration/models.py index 4a2d4e9614b27..61689f31b7291 100644 --- a/tests/regressiontests/admin_registration/models.py +++ b/tests/regressiontests/admin_registration/models.py @@ -7,5 +7,9 @@ class Person(models.Model): name = models.CharField(max_length=200) -class Place(models.Model): +class Location(models.Model): + class Meta: + abstract = True + +class Place(Location): name = models.CharField(max_length=200) diff --git a/tests/regressiontests/admin_registration/tests.py b/tests/regressiontests/admin_registration/tests.py index e2a5d7e017913..92e9d8a21e591 100644 --- a/tests/regressiontests/admin_registration/tests.py +++ b/tests/regressiontests/admin_registration/tests.py @@ -1,8 +1,8 @@ from django.test import TestCase - +from django.core.exceptions import ImproperlyConfigured from django.contrib import admin -from models import Person, Place +from models import Person, Place, Location class NameAdmin(admin.ModelAdmin): list_display = ['name'] @@ -52,3 +52,10 @@ def test_iterable_registration(self): isinstance(self.site._registry[Place], admin.options.ModelAdmin) ) self.assertEqual(self.site._registry[Place].search_fields, ['name']) + + def test_abstract_model(self): + """ + Exception is raised when trying to register an abstract model. + Refs #12004. + """ + self.assertRaises(ImproperlyConfigured, self.site.register, Location)