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