Commit 3c8568a7 authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixed #10271, #10281 -- Fixed the handling multiple inline models that share...

Fixed #10271, #10281 --  Fixed the handling multiple inline models that share a common base class and have the link to the inline parent on the base class. Includes modifications that allow the equivalent handling for GenericFields. Thanks to Idan Gazit, Antti Kaihola (akaihola), and Alex Gaynor for their work on this patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10017 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent d0fff8cc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -161,6 +161,7 @@ answer newbie questions, and generally made Django that much better:
    Marc Garcia <marc.garcia@accopensys.com>
    Alex Gaynor <alex.gaynor@gmail.com>
    Andy Gayton <andy-django@thecablelounge.com>
    Idan Gazit
    Baishampayan Ghose
    Dimitris Glezos <dimitris@glezos.com>
    glin@seznam.cz
+25 −4
Original line number Diff line number Diff line
@@ -522,10 +522,16 @@ class ModelAdmin(BaseModelAdmin):
            else:
                form_validated = False
                new_object = self.model()
            prefixes = {}
            for FormSet in self.get_formsets(request):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(data=request.POST, files=request.FILES,
                                  instance=new_object,
                                  save_as_new=request.POST.has_key("_saveasnew"))
                                  save_as_new=request.POST.has_key("_saveasnew"),
                                  prefix=prefix)
                formsets.append(formset)
            if all_valid(formsets) and form_validated:
                self.save_model(request, new_object, form, change=False)
@@ -547,8 +553,13 @@ class ModelAdmin(BaseModelAdmin):
                if isinstance(f, models.ManyToManyField):
                    initial[k] = initial[k].split(",")
            form = ModelForm(initial=initial)
            prefixes = {}
            for FormSet in self.get_formsets(request):
                formset = FormSet(instance=self.model())
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(instance=self.model(), prefix=prefix)
                formsets.append(formset)
        
        adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields)
@@ -608,9 +619,14 @@ class ModelAdmin(BaseModelAdmin):
            else:
                form_validated = False
                new_object = obj
            prefixes = {}
            for FormSet in self.get_formsets(request, new_object):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(request.POST, request.FILES,
                                  instance=new_object)
                                  instance=new_object, prefix=prefix)
                formsets.append(formset)
            
            if all_valid(formsets) and form_validated:
@@ -625,8 +641,13 @@ class ModelAdmin(BaseModelAdmin):
        
        else:
            form = ModelForm(instance=obj)
            prefixes = {}
            for FormSet in self.get_formsets(request, obj):
                formset = FormSet(instance=obj)
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(instance=obj, prefix=prefix)
                formsets.append(formset)
        
        adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields)
+10 −2
Original line number Diff line number Diff line
@@ -291,7 +291,7 @@ class BaseGenericInlineFormSet(BaseModelFormSet):
    ct_field_name = "content_type"
    ct_fk_field_name = "object_id"

    def __init__(self, data=None, files=None, instance=None, save_as_new=None):
    def __init__(self, data=None, files=None, instance=None, save_as_new=None, prefix=None):
        opts = self.model._meta
        self.instance = instance
        self.rel_name = '-'.join((
@@ -300,9 +300,17 @@ class BaseGenericInlineFormSet(BaseModelFormSet):
        ))
        super(BaseGenericInlineFormSet, self).__init__(
            queryset=self.get_queryset(), data=data, files=files,
            prefix=self.rel_name
            prefix=prefix
        )

    #@classmethod
    def get_default_prefix(cls):
        opts = cls.model._meta
        return '-'.join((opts.app_label, opts.object_name.lower(),
                        cls.ct_field.name, cls.ct_fk_field.name,
        ))
    get_default_prefix = classmethod(get_default_prefix)

    def get_queryset(self):
        # Avoid a circular import.
        from django.contrib.contenttypes.models import ContentType
+9 −4
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ class BaseFormSet(StrAndUnicode):
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
                 initial=None, error_class=ErrorList):
        self.is_bound = data is not None or files is not None
        self.prefix = prefix or 'form'
        self.prefix = prefix or self.get_default_prefix()
        self.auto_id = auto_id
        self.data = data
        self.files = files
@@ -176,6 +176,11 @@ class BaseFormSet(StrAndUnicode):
        return [self.forms[i[0]] for i in self._ordering]
    ordered_forms = property(_get_ordered_forms)

    #@classmethod
    def get_default_prefix(cls):
        return 'form'
    get_default_prefix = classmethod(get_default_prefix)

    def non_form_errors(self):
        """
        Returns an ErrorList of errors that aren't associated with a particular
+9 −3
Original line number Diff line number Diff line
@@ -472,7 +472,7 @@ class BaseInlineFormSet(BaseModelFormSet):
        # is there a better way to get the object descriptor?
        self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
        qs = self.model._default_manager.filter(**{self.fk.name: self.instance})
        super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix or self.rel_name,
        super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix,
                                                queryset=qs)

    def _construct_forms(self):
@@ -489,6 +489,12 @@ class BaseInlineFormSet(BaseModelFormSet):
            form.data[form.add_prefix(self._pk_field.name)] = None
        return form

    #@classmethod
    def get_default_prefix(cls):
        from django.db.models.fields.related import RelatedObject
        return RelatedObject(cls.fk.rel.to, cls.model, cls.fk).get_accessor_name()
    get_default_prefix = classmethod(get_default_prefix)

    def save_new(self, form, commit=True):
        fk_attname = self.fk.get_attname()
        kwargs = {fk_attname: self.instance.pk}
Loading