inlineformset - 递增TOTAL_FORMS给出MultiValueDictKeyError

时间:2018-04-27 15:04:16

标签: django inline-formset dynamicform

我正在尝试在没有javascript支持的情况下实现动态formset。

为此,我在表单底部添加了一个按钮,

<input type="submit" name="add_item" value="+" id="submit-id-add_item">

现在,在我的CreateView中,我尝试了以下代码。

def get_context_data(self, **kwargs):
    context = super(AddInvoice, self).get_context_data(**kwargs)
    ItemInlineFormSet = inlineformset_factory(Invoice, InvoiceItem, form=InvoiceItemForm, extra=1,  can_delete=False, formset=InvoiceItemFormSet)
    if self.request.method=='POST':
        if 'add_item' in self.request.POST:
            cp = self.request.POST.copy()
            cp['item-TOTAL_FORMS'] = int(cp['item-TOTAL_FORMS'])+ 1
            context['item_formset'] = ItemInlineFormSet(cp,prefix='item')
            else:
                context['item_formset'] = ItemInlineFormSet(self.request.POST,prefix='item')

    else:
        context['item_formset'] = ItemInlineFormSet (prefix='item')
        return context

但是,当我点击add_item按钮时,我收到以下错误

  

在''item-1-item'

的MultiValueDictKeyError

(我的form prefixitem,并且还有一个名为item的字段)

我怀疑这是因为django寻找下一组表单元素以匹配 TOTAL_FORMS ,但它找不到任何地方。

我在这里缺少什么?

感谢。

1 个答案:

答案 0 :(得分:0)

我最初在extra附近尝试了一些不起作用的东西 - 也许我忽略了一些东西。这是工作代码。

ItemInlineFormSet = inlineformset_factory(Invoice, InvoiceItem, 
    form=InvoiceItemForm,
    extra=extra,  can_delete=False,
    formset=InvoiceItemFormSet)

if self.request.method=='POST':
    if 'add_item' in self.request.POST:
        extra= int(self.request.POST.get('item-TOTAL_FORMS'))+ 1
        ItemInlineFormSet = inlineformset_factory(Invoice, InvoiceItem, form=InvoiceItemForm, extra=extra,  can_delete=False,
                                         formset=InvoiceItemFormSet)
        context['item_formset'] = ItemInlineFormSet(prefix='item')
    else:

        context['item_formset'] = ItemInlineFormSet(self.request.POST,prefix='item')

else:
    context['item_formset'] = ItemInlineFormSet (prefix='item')
return context