Skip to content

Commit

Permalink
Merge pull request #322 from skirsdeda/admin_fieldsets_fix
Browse files Browse the repository at this point in the history
Admin fieldsets fix (another attempt)
  • Loading branch information
vdboor committed Jan 15, 2018
2 parents a2ba525 + 180df8e commit 733b28c
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions polymorphic/admin/childadmin.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ def get_form(self, request, obj=None, **kwargs):
# If the derived class sets the model explicitly, respect that setting.
kwargs.setdefault('form', self.base_form or self.form)

# prevent infinite recursion when this is called from get_subclass_fields
if not self.fieldsets and not self.fields:
kwargs.setdefault('fields', '__all__')

return super(PolymorphicChildModelAdmin, self).get_form(request, obj, **kwargs)

def get_model_perms(self, request):
Expand Down Expand Up @@ -181,7 +185,12 @@ def history_view(self, request, object_id, extra_context=None):

# ---- Extra: improving the form/fieldset default display ----

def get_base_fieldsets(self, request, obj=None):
return self.base_fieldsets

def get_fieldsets(self, request, obj=None):
base_fieldsets = self.get_base_fieldsets(request, obj)

# If subclass declares fieldsets or fields, this is respected
if self.fieldsets or self.fields or not self.base_fieldsets:
return super(PolymorphicChildModelAdmin, self).get_fieldsets(request, obj)
Expand All @@ -192,11 +201,11 @@ def get_fieldsets(self, request, obj=None):

if other_fields:
return (
self.base_fieldsets[0],
base_fieldsets[0],
(self.extra_fieldset_title, {'fields': other_fields}),
) + self.base_fieldsets[1:]
) + base_fieldsets[1:]
else:
return self.base_fieldsets
return base_fieldsets

def get_subclass_fields(self, request, obj=None):
# Find out how many fields would really be on the form,
Expand All @@ -210,7 +219,7 @@ def get_subclass_fields(self, request, obj=None):
subclass_fields = list(six.iterkeys(form.base_fields)) + list(self.get_readonly_fields(request, obj))

# Find which fields are not part of the common fields.
for fieldset in self.base_fieldsets:
for fieldset in self.get_base_fieldsets(request, obj):
for field in fieldset[1]['fields']:
try:
subclass_fields.remove(field)
Expand Down

0 comments on commit 733b28c

Please sign in to comment.