Browse Source

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
Russell Keith-Magee 14 years ago
parent
commit
12bd7bcb35

+ 6 - 0
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__)
 

+ 5 - 1
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)

+ 9 - 2
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)