diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index e798587040..c87d903ec5 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -108,9 +108,10 @@ class BaseModelAdmin(object): # If we've got overrides for the formfield defined, use 'em. **kwargs # passed to formfield_for_dbfield override the defaults. - if db_field.__class__ in self.formfield_overrides: - kwargs = dict(self.formfield_overrides[db_field.__class__], **kwargs) - return db_field.formfield(**kwargs) + for klass in db_field.__class__.mro(): + if klass in self.formfield_overrides: + kwargs = dict(self.formfield_overrides[klass], **kwargs) + return db_field.formfield(**kwargs) # For any other type of field, just call its formfield() method. return db_field.formfield(**kwargs) diff --git a/tests/regressiontests/admin_widgets/models.py b/tests/regressiontests/admin_widgets/models.py index 1ba759b2d3..0c81ed3119 100644 --- a/tests/regressiontests/admin_widgets/models.py +++ b/tests/regressiontests/admin_widgets/models.py @@ -4,6 +4,9 @@ from django.db import models from django.core.files.storage import default_storage from django.contrib.auth.models import User +class MyFileField(models.FileField): + pass + class Member(models.Model): name = models.CharField(max_length=100) birthdate = models.DateTimeField(blank=True, null=True) @@ -23,6 +26,7 @@ class Album(models.Model): band = models.ForeignKey(Band) name = models.CharField(max_length=100) cover_art = models.FileField(upload_to='albums') + backside_art = MyFileField(upload_to='albums_back', null=True) def __unicode__(self): return self.name diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py index c2b040368d..55088ca1fe 100644 --- a/tests/regressiontests/admin_widgets/tests.py +++ b/tests/regressiontests/admin_widgets/tests.py @@ -98,6 +98,8 @@ class AdminFormfieldForDBFieldTests(TestCase): self.assertFormfield(models.Member, 'gender', widgets.AdminRadioSelect, radio_fields={'gender':admin.VERTICAL}) + def testInheritance(self): + self.assertFormfield(models.Album, 'backside_art', widgets.AdminFileWidget) class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase): fixtures = ["admin-widgets-users.xml"] @@ -113,13 +115,13 @@ class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase): class AdminForeignKeyWidgetChangeList(DjangoTestCase): fixtures = ["admin-widgets-users.xml"] - + def setUp(self): self.client.login(username="super", password="secret") - + def tearDown(self): self.client.logout() - + def test_changelist_foreignkey(self): response = self.client.get('/widget_admin/admin_widgets/car/') self.failUnless('/widget_admin/auth/user/add/' in response.content)