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
This commit is contained in:
Russell Keith-Magee 2011-02-23 13:43:21 +00:00
parent 7aa84917a4
commit 12bd7bcb35
3 changed files with 20 additions and 3 deletions

View File

@ -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__)

View File

@ -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)

View File

@ -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)