From d1c58459665e74e3d99ff815d07124948e059af4 Mon Sep 17 00:00:00 2001 From: Tadas Dailyda Date: Mon, 20 Nov 2017 16:15:10 +0200 Subject: [PATCH] further childadmin fieldsets improvements (cherry picked from commit 15426dc695f67a06ce46539b3f44208057bb67a5) --- polymorphic/admin/childadmin.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/polymorphic/admin/childadmin.py b/polymorphic/admin/childadmin.py index cad47d6..be1b022 100644 --- a/polymorphic/admin/childadmin.py +++ b/polymorphic/admin/childadmin.py @@ -62,8 +62,8 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): # If the derived class sets the model explicitly, respect that setting. kwargs.setdefault('form', self.base_form or self.form) - # prevent infinite recursion in django 1.6+ - if not getattr(self, 'declared_fieldsets', None): + # prevent infinite recursion when this is called from get_subclass_fields + if not hasattr(self, 'fieldsets') and not hasattr(self, 'fields'): kwargs.setdefault('fields', None) return super(PolymorphicChildModelAdmin, self).get_form(request, obj, **kwargs) @@ -185,10 +185,14 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): # ---- 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): - # If subclass declares fieldsets, this is respected - if (hasattr(self, 'declared_fieldsets') and self.declared_fieldsets) \ - or not self.base_fieldsets: + 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) # Have a reasonable default fieldsets, @@ -197,11 +201,11 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): 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, @@ -215,7 +219,7 @@ class PolymorphicChildModelAdmin(admin.ModelAdmin): 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)