【问题标题】:Editing inlineformsets associated with parent form编辑与父表单关联的内联表单集
【发布时间】:2014-12-17 18:53:24
【问题描述】:

我使用 Modelform 和 inlineforset_factory 创建了发票和其中的项目。 现在我正在尝试创建编辑表单,但是当我尝试编辑这些内联字段时出现 MultiValueDictKeyError。如果我只是创建新的内联表单集,我可以很好地编辑 Modelform。经过一小时的谷歌搜索,我离找到任何解决方案还差得远。

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

创建新发票(完美运行)

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 })

编辑发票 (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 })

【问题讨论】:

    标签: python django inline-formset


    【解决方案1】:

    您有两个变量,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)
    

    让我知道这是否适合你。

    【讨论】:

    • 可悲的是,当我尝试提交它时,它完全符合我的情况。 MultiValueDictKeyError with "u'item_set-0-id'".. 我怀疑由于某种原因它们没有被编辑而是被替换。我正在尝试另一种方法...删除所选发票中的所有项目并重新添加它们...我是stackoverflow的新手,我想我应该通过添加评论来让您知道,希望它是正确的方法。谢谢
    • 感谢您告诉我。对不起,它不适合你:-/
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-01-14
      • 2014-07-15
      • 2014-01-01
      • 2010-12-07
      • 2014-11-15
      • 2018-02-09
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多