0

i can save a formset in post method, but when i try to edit it in my "put" method, my formset.is_valid returns false ... i excluded some logic in this code samples and replaced it with .... so it is easier to read...

hope this is enough information to get an idea of my problem

my view.py

class AngebotView(View):

    def get(self, request, id=None):
        if id: # edit view
            .................
            raum_formset = RaumFormSet(queryset=objekt.t_raum_set.all())
            raum_formset.extra = 0 #set extra to 0, otherwise there is always a additional form in the edit view
            template = 'angebot/edit_angebot.html'
        else: # create view
            .....................
            # Create an instance of the formset
            raum_formset = RaumFormSet(queryset=T_Raum.objects.none())
            template = 'angebot/new_angebot.html'
            
        context = {'kunde_form': kunde_form, 'angebot_form': angebot_form,
                   'objekt_form': objekt_form, 'raum_formset': raum_formset}
        
        return render(request, template, context)

    def post(self, request, id=None):  # Post = save/edit
        context = {}
        if id:
            return self.put(request, id) #when id then PUT = EDIT

            ........
            formset_raum = RaumFormSet(data=self.request.POST)

        # wenn die Eingabe der Formen passt
        if formset_raum.is_valid():
            ..................

            raum_instances = formset_raum.save(commit=False)
    
            for new_raum in raum_instances:
                new_raum.objektid = new_objekt #set foreign key
                new_raum.save()
    
            messages.success(request, 'Angebot wurde gespeichert!')
            return HttpResponseRedirect(reverse('angebot:angebot_details', kwargs={'id': new_angebot.id}))
    else:
    # TODO: Errorhandling
        raise Http404

    context = {'angebot_form': angebot_form, 'kunde_form': kunde_form,
           'objekt_form': objekt_form, 'raum_formset': formset_raum}

    return render(request, 'angebot/new_angebot.html', context)
    
    def put(self, request, id=None):  # save the edit
        context = {}
        .................
    
        formset_raum = RaumFormSet(data=self.request.POST)
        
        if formset_raum.is_valid(): #this is not working !!!!
        
            raum_instances = formset_raum.save(commit=False)
        
            for new_raum in raum_instances:
                new_raum.objektid = new_objekt  # set foreign key
                new_raum.save()
        
            messages.success(request, 'Angebot wurde erfolgreich geƤndert!')
            return HttpResponseRedirect(reverse('angebot:angebot_details', kwargs={'id': new_angebot.id}))
        
        else:
            messages.warning(request, 'Eingabe -- Invalid')
        
        context = {'angebot_form': angebot_form, 'kunde_form': kunde_form,
                   'objekt_form': objekt_form, 'raum_formset': formset_raum}
        
        return render(request, 'angebot/edit_angebot.html', context)
        

forms.py

RaumFormSet = modelformset_factory(
    T_Raum, fields=("name", "hoehe", 'flaeche', 'anzfenster', 'anzaussenflaechen', 'alternative', 'anzS', 'anzM', 'anzL', 'anzManuellUeberschrieben'), extra=1
)

edit_angebot.html template:

                     {{raum_formset.management_form}}
                    {% for raum in raum_formset %}
                         <tr id="rowToClone">
                           <td> {{ raum.name }} </td>
                           <td> {{ raum.hoehe }} </td>
                           <td> {{ raum.flaeche }} </td>
                           <td> {{ raum.anzfenster }} </td>
                           <td> {{ raum.anzaussenflaechen }} </td>
                           <td> {{ raum.alternative }} </td>
                         </tr>
                    {% endfor %}

been searchin a while but cant get it working ??

would appreciate any help !!!

1 Answers1

0

Finally got it!!

After long long debugging und searching i found the mistake. like in this post django formset not validating because ID is required i had to add {{ form.id }} into my template loop... the id doenst get shown on the html page, but somehow is required in edit mode....

thanks user J-a-n-u-s: As an addendum to @unixo 's answer, simply putting: {{ form.id }}