Python 编辑与父窗体关联的InLineFormSet

Python 编辑与父窗体关联的InLineFormSet,python,django,inline-formset,Python,Django,Inline Formset,我已经使用Modelform和inlineforset_factory创建了发票和其中的项目。 现在我正在尝试创建编辑表单,但是当我尝试编辑那些内联字段时,我遇到了多值错误。如果我只是创建新的inlineformset,我可以很好地编辑Modelform。在谷歌搜索了一个小时后,我再也找不到任何解决办法了 maxItems = 20 ItemFormSet = inlineformset_factory(Invoice, Item, can_delete=True, extra=maxItems

我已经使用Modelform和inlineforset_factory创建了发票和其中的项目。 现在我正在尝试创建编辑表单,但是当我尝试编辑那些内联字段时,我遇到了多值错误。如果我只是创建新的inlineformset,我可以很好地编辑Modelform。在谷歌搜索了一个小时后,我再也找不到任何解决办法了

maxItems = 20
ItemFormSet = inlineformset_factory(Invoice, Item, can_delete=True, extra=maxItems)
创建新发票(工作正常)

编辑发票(多值错误)


您有两个变量,
invoicer
invoice
,我假设它们是同一对象的不同实例。尝试按如下方式重新编写编辑视图:

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

让我知道这是否适合您。

好的,所以我发现问题不在views.py或forms.py中,而是在模板中。因为我没有使用{form.as_p/table/..}构建模板,表单有一些额外的输入-DELETE、ID和foreignKey。。。将它们添加到我的for循环后,一切正常:)

遗憾的是,当我尝试提交它时,它确实发生了什么。具有“u'项\ u集-0-id'”的多值错误。。我怀疑出于某种原因,它们没有被编辑,而是被替换。我正在尝试另一种方法。。。删除所选发票中的所有项目并重新添加。。。我是stackoverflow的新手,我想我应该通过添加评论让你知道,希望这是正确的方式。谢谢你让我知道。很抱歉,它对您不起作用:-/
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 })
def edit_invoice(request, invoice_id):
    invoice = get_object_or_404(Invoice, pk=invoice_id)
    if request.method == 'POST':
        form = InvoiceForm(request.POST, instance=invoice)
        formset = ItemFormSet(request.POST, instance=invoice)
        if form.is_valid() and formset.is_valid():
            invoice = form.save()
            invoice.dateCreated = datetime.datetime.now()
            invoice.save()
            formset.save()
            return redirect('list/new0')
    else:
        form = InvoiceForm(instance=invoice)
        formset = ItemFormSet(instance=invoice)
    context = {
      'form': form,
      'formset': formset,
    }
    return render(request, 'form.html', context)