Skip to content

Commit 555a8da

Browse files
committed
Fix class Meta inheritance
1 parent 42ca654 commit 555a8da

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

form_utils/forms.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def get_fields_from_fieldsets(fieldsets):
128128
raise ValueError('"fieldsets" must be an iterable of two-tuples, '
129129
'and the second tuple must be a dictionary '
130130
'with a "fields" key')
131-
return fields
131+
return fields or None
132132

133133

134134
def get_row_attrs(bases, attrs):

tests/tests.py

+69-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
from django import forms
66
from django import template
77
from django.core.files.uploadedfile import SimpleUploadedFile
8-
from django.db.models.fields.files import FieldFile, ImageFieldFile, FileField, ImageField
8+
from django.db.models.fields.files import (
9+
FieldFile, ImageFieldFile, FileField, ImageField)
910
from django.test import TestCase
1011
from django.utils import six
1112

@@ -17,6 +18,7 @@
1718

1819
from .models import Person, Document
1920

21+
2022
class ApplicationForm(BetterForm):
2123
"""
2224
A sample form with fieldsets.
@@ -25,11 +27,13 @@ class ApplicationForm(BetterForm):
2527
name = forms.CharField()
2628
position = forms.CharField()
2729
reference = forms.CharField(required=False)
30+
2831
class Meta:
2932
fieldsets = (('main', {'fields': ('name', 'position'), 'legend': ''}),
3033
('Optional', {'fields': ('reference',),
3134
'classes': ('optional',)}))
3235

36+
3337
class InheritedForm(ApplicationForm):
3438
"""
3539
An inherited form that does not define its own fieldsets inherits
@@ -38,13 +42,15 @@ class InheritedForm(ApplicationForm):
3842
"""
3943
pass
4044

45+
4146
class MudSlingerApplicationForm(ApplicationForm):
4247
"""
4348
Inherited forms can manually inherit and change/override the
4449
parents' fieldsets by using the logical Python code in Meta:
4550
4651
"""
4752
target = forms.CharField()
53+
4854
class Meta:
4955
fieldsets = list(ApplicationForm.Meta.fieldsets)
5056
fieldsets[0] = ('main', {'fields': ('name', 'position', 'target'),
@@ -74,6 +80,7 @@ class HoneypotForm(BetterForm):
7480
"""
7581
honeypot = forms.CharField()
7682
name = forms.CharField()
83+
7784
class Meta:
7885
row_attrs = {'honeypot': {'style': 'display: none'}}
7986

@@ -88,6 +95,7 @@ class PersonForm(BetterModelForm):
8895
8996
"""
9097
title = forms.CharField()
98+
9199
class Meta:
92100
model = Person
93101
fieldsets = [('main', {'fields': ['name'],
@@ -109,6 +117,7 @@ class Meta:
109117
model = Person
110118
fieldsets = [('main', {'fields': ['name']})]
111119

120+
112121
class ManualPartialPersonForm(BetterModelForm):
113122
"""
114123
A ``BetterModelForm`` whose fieldsets don't contain all fields
@@ -120,6 +129,7 @@ class Meta:
120129
fieldsets = [('main', {'fields': ['name']})]
121130
fields = ['name', 'age']
122131

132+
123133
class ExcludePartialPersonForm(BetterModelForm):
124134
"""
125135
A ``BetterModelForm`` whose fieldsets don't contain all fields
@@ -131,6 +141,7 @@ class Meta:
131141
fieldsets = [('main', {'fields': ['name']})]
132142
exclude = ['age']
133143

144+
134145
class AcrobaticPersonForm(PersonForm):
135146
"""
136147
A ``BetterModelForm`` that inherits from another and overrides one
@@ -139,10 +150,39 @@ class AcrobaticPersonForm(PersonForm):
139150
"""
140151
agility = forms.IntegerField()
141152
speed = forms.IntegerField()
153+
142154
class Meta(PersonForm.Meta):
143155
fieldsets = list(PersonForm.Meta.fieldsets)
144-
fieldsets = fieldsets[:1] + \
145-
[('Acrobatics', {'fields': ('age', 'speed', 'agility')})]
156+
fieldsets = fieldsets[:1] + [
157+
('Acrobatics', {'fields': ('age', 'speed', 'agility')})]
158+
159+
160+
class AbstractPersonForm(BetterModelForm):
161+
"""
162+
An abstract ``BetterModelForm`` without fieldsets.
163+
164+
"""
165+
title = forms.CharField()
166+
167+
class Meta:
168+
pass
169+
170+
171+
class InheritedMetaAbstractPersonForm(AbstractPersonForm):
172+
"""
173+
A ``BetterModelForm`` that inherits from abstract one and its Meta class
174+
and adds fieldsets
175+
176+
"""
177+
class Meta(AbstractPersonForm.Meta):
178+
model = Person
179+
fieldsets = [('main', {'fields': ['name'],
180+
'legend': '',
181+
'classes': ['main']}),
182+
('More', {'fields': ['age'],
183+
'description': 'Extra information',
184+
'classes': ['more', 'collapse']}),
185+
(None, {'fields': ['title']})]
146186

147187

148188
class BetterFormTests(TestCase):
@@ -249,6 +289,32 @@ class BetterFormTests(TestCase):
249289
'classes': ''
250290
}),
251291
],
292+
InheritedMetaAbstractPersonForm:
293+
[
294+
(['name'],
295+
{
296+
'name': 'main',
297+
'legend': '',
298+
'description': '',
299+
'classes': 'main',
300+
}),
301+
(['age'],
302+
{
303+
'name': 'More',
304+
'legend': 'More',
305+
'description': 'Extra information',
306+
'classes': 'more collapse'
307+
}),
308+
(['title'],
309+
{
310+
'name': None,
311+
'legend': None,
312+
'description': '',
313+
'classes': ''
314+
}),
315+
],
316+
317+
252318
}
253319

254320
def test_iterate_fieldsets(self):

0 commit comments

Comments
 (0)