Django Inline Formset "update" functionality is not working

48 views Asked by At

Django project: For Create and Update, I used Class Based View method. In there, I have form (parent) and formset (of child). Both ParentForm and ChildFormset are in the same page. Create functionality is working perfectly.

Problem: Update functionality is not saving changes because of already existing formset. It only refreshes the current page. How to fix it?

class ParentInline():
    form_class = ParentForm
    model = Parent
    template_name = "parent_create_or_update.html"

    def form_valid(self, form):        
        named_formsets = self.get_named_formsets()
        if not all((x.is_valid() for x in named_formsets.values())):
            return self.render_to_response(self.get_context_data(form=form))

        self.object = form.save()

        # for every formset, attempt to find a specific formset save function
        # otherwise, just save.
        for name, formset in named_formsets.items():
            formset_save_func = getattr(self, 'formset_{0}_valid'.format(name), None)
            if formset_save_func is not None:
                formset_save_func(formset)
            else:
                formset.save()
        return redirect('/parent_list')

    def formset_childs_valid(self, formset):
        """
        Hook for custom formset saving.Useful if you have multiple formsets
        """
        childs = formset.save(commit=False)  # self.save_formset(formset, contact)
        for child in childs:
            child.parent_Id = self.object
            child.save()


class ParentCreate(ParentInline, CreateView):

    def get_context_data(self, **kwargs):
        ctx = super(ParentCreate, self).get_context_data(**kwargs)
        ctx['named_formsets'] = self.get_named_formsets()
        return ctx

    def get_named_formsets(self):
        if self.request.method == "GET":
            return {
                'childs': ChildFormSet(prefix='childs'),
            }
        else:
            return {
                'childs': ChildFormSet(self.request.POST or None, self.request.FILES or None, 
                                            prefix='childs'),
            }


class ParentUpdate(ParentInline, UpdateView):

    def get_context_data(self, **kwargs):
        ctx = super(ParentUpdate, self).get_context_data(**kwargs)
        ctx['named_formsets'] = self.get_named_formsets()
        return ctx

    def get_named_formsets(self):
        return {
            'childs': ChildFormSet(self.request.POST or None, self.request.FILES or None, 
                                        instance=self.object, prefix='childs')
        }
0

There are 0 answers