diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index c1f6970193..4585627a0b 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -61,6 +61,8 @@ class AdminSite(object): 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 @@ class AdminSite(object): 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 4a2d4e9614..61689f31b7 100644 --- a/tests/regressiontests/admin_registration/models.py +++ b/tests/regressiontests/admin_registration/models.py @@ -7,5 +7,9 @@ from django.db import models 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 e2a5d7e017..92e9d8a21e 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 @@ class TestRegistration(TestCase): 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)