Skip to content

Commit f55f2b9

Browse files
committed
Fixed #10059: ModelAdmin.formfield_for_dbfield now handles custom Field subclasses. Thanks, Alex Gaynor.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10454 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent 6eaf154 commit f55f2b9

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

django/contrib/admin/options.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,10 @@ def formfield_for_dbfield(self, db_field, **kwargs):
108108

109109
# If we've got overrides for the formfield defined, use 'em. **kwargs
110110
# passed to formfield_for_dbfield override the defaults.
111-
if db_field.__class__ in self.formfield_overrides:
112-
kwargs = dict(self.formfield_overrides[db_field.__class__], **kwargs)
113-
return db_field.formfield(**kwargs)
111+
for klass in db_field.__class__.mro():
112+
if klass in self.formfield_overrides:
113+
kwargs = dict(self.formfield_overrides[klass], **kwargs)
114+
return db_field.formfield(**kwargs)
114115

115116
# For any other type of field, just call its formfield() method.
116117
return db_field.formfield(**kwargs)

tests/regressiontests/admin_widgets/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
from django.core.files.storage import default_storage
55
from django.contrib.auth.models import User
66

7+
class MyFileField(models.FileField):
8+
pass
9+
710
class Member(models.Model):
811
name = models.CharField(max_length=100)
912
birthdate = models.DateTimeField(blank=True, null=True)
@@ -23,6 +26,7 @@ class Album(models.Model):
2326
band = models.ForeignKey(Band)
2427
name = models.CharField(max_length=100)
2528
cover_art = models.FileField(upload_to='albums')
29+
backside_art = MyFileField(upload_to='albums_back', null=True)
2630

2731
def __unicode__(self):
2832
return self.name

tests/regressiontests/admin_widgets/tests.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ def testChoicesWithRadioFields(self):
9898
self.assertFormfield(models.Member, 'gender', widgets.AdminRadioSelect,
9999
radio_fields={'gender':admin.VERTICAL})
100100

101+
def testInheritance(self):
102+
self.assertFormfield(models.Album, 'backside_art', widgets.AdminFileWidget)
101103

102104
class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase):
103105
fixtures = ["admin-widgets-users.xml"]
@@ -113,13 +115,13 @@ def testFilterChoicesByRequestUser(self):
113115

114116
class AdminForeignKeyWidgetChangeList(DjangoTestCase):
115117
fixtures = ["admin-widgets-users.xml"]
116-
118+
117119
def setUp(self):
118120
self.client.login(username="super", password="secret")
119-
121+
120122
def tearDown(self):
121123
self.client.logout()
122-
124+
123125
def test_changelist_foreignkey(self):
124126
response = self.client.get('/widget_admin/admin_widgets/car/')
125127
self.failUnless('/widget_admin/auth/user/add/' in response.content)

0 commit comments

Comments
 (0)