Search code examples
pythondjangoinline-formset

Editing inlineformsets associated with parent form


I have created an invoice and items in it using Modelform and inlineforset_factory. Now I am trying to create edit form, but I am getting MultiValueDictKeyError when I try to edit those inline fields. If I just create new inlineformsets I can edit Modelform just fine. After one hour of googling I am no closer to finding any solution.

maxItems = 20
ItemFormSet = inlineformset_factory(Invoice, Item, can_delete=True, extra=maxItems)

Creating of new invoice (working perfectly)

def new_invoice(request):
if request.method == "POST":
    form = InvoiceForm(request.POST)
    if form.is_valid():
        invoice = form.save(commit=False)
        item_formset = ItemFormSet(request.POST,instance=invoice)
        if item_formset.is_valid():
            invoice.dateCreated = datetime.datetime.now()
            invoice.save()
            item_formset.save()
            return redirect('list/new0')
else:
    form = InvoiceForm()
    item_formset = ItemFormSet(instance=Invoice())
return render(request, "form.html", {"form": form, "item_formset": item_formset })

Editing invoice (MultiValueDictKeyError)

def edit_invoice(request, invoice_id):
invoicer = get_object_or_404(Invoice, pk=invoice_id)
if request.method == "POST":
    form = InvoiceForm(request.POST, instance=invoicer)
    if form.is_valid():
        invoice = form.save(commit=False)
        item_formset = ItemFormSet(request.POST,instance=invoice)
        if item_formset.is_valid():
            invoice.dateCreated = datetime.datetime.now()
            invoice.save()
            item_formset.save()
            return redirect('list/new0')
else:
    form = InvoiceForm(instance=invoicer)
    item_formset = ItemFormSet(instance=invoicer)
return render(request, "form.html", {"form": form, "item_formset": item_formset })

Solution

  • Ok, so I've found that problem was not in the views.py nor in forms.py, but in template. Because I've built the template without using {{form.as_p/table/...}} The form had some extra inputs - DELETE,ID and foreignKey... after adding them to my for loop, everything works fine :)