From ca6a604730f8196181352abab3d4d25222d27a2f Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Sun, 8 Oct 2017 22:21:44 +0200 Subject: [PATCH] Fix support for proxy models in formsets and admin inlines --- polymorphic/admin/generic.py | 2 +- polymorphic/admin/helpers.py | 2 +- polymorphic/formsets/models.py | 7 +++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/polymorphic/admin/generic.py b/polymorphic/admin/generic.py index bd3453fa..91fc0828 100644 --- a/polymorphic/admin/generic.py +++ b/polymorphic/admin/generic.py @@ -42,7 +42,7 @@ def content_type(self): Expose the ContentType that the child relates to. This can be used for the ``polymorphic_ctype`` field. """ - return ContentType.objects.get_for_model(self.model) + return ContentType.objects.get_for_model(self.model, for_concrete_model=False) def get_formset_child(self, request, obj=None, **kwargs): # Similar to GenericInlineModelAdmin.get_formset(), diff --git a/polymorphic/admin/helpers.py b/polymorphic/admin/helpers.py index 33221e83..f935ed1d 100644 --- a/polymorphic/admin/helpers.py +++ b/polymorphic/admin/helpers.py @@ -42,7 +42,7 @@ def __iter__(self): """ for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()): # Output the form - model = original.get_real_concrete_instance_class() + model = original.get_real_instance_class() child_inline = self.opts.get_child_inline_instance(model) view_on_site_url = self.opts.get_view_on_site_url(original) diff --git a/polymorphic/formsets/models.py b/polymorphic/formsets/models.py index 9dc676c4..a4a7bef5 100644 --- a/polymorphic/formsets/models.py +++ b/polymorphic/formsets/models.py @@ -14,7 +14,6 @@ class UnsupportedChildType(LookupError): pass - class PolymorphicFormSetChild(object): """ Metadata to define the inline of a polymorphic child. @@ -46,7 +45,7 @@ def content_type(self): Expose the ContentType that the child relates to. This can be used for the ''polymorphic_ctype'' field. """ - return ContentType.objects.get_for_model(self.model) + return ContentType.objects.get_for_model(self.model, for_concrete_model=False) def get_form(self, **kwargs): """ @@ -161,7 +160,7 @@ def _construct_form(self, i, **kwargs): if self.is_bound: if 'instance' in defaults: # Object is already bound to a model, won't change the content type - model = defaults['instance'].get_real_concrete_instance_class() # respect proxy models + model = defaults['instance'].get_real_instance_class() # allow proxy models else: # Extra or empty form, use the provided type. # Note this completely tru @@ -177,7 +176,7 @@ def _construct_form(self, i, **kwargs): raise UnsupportedChildType("Child model type {0} is not part of the formset".format(model)) else: if 'instance' in defaults: - model = defaults['instance'].get_real_concrete_instance_class() # respect proxy models + model = defaults['instance'].get_real_instance_class() # allow proxy models elif 'polymorphic_ctype' in defaults.get('initial', {}): model = defaults['initial']['polymorphic_ctype'].model_class() elif i < len(self.queryset_data):