inlineformset - увеличение TOTAL_FORMS дает MultiValueDictKeyError - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь добиться динамического набора форм без поддержки JavaScript.

Для этого я добавил кнопку внизу формы,

<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, я получаю следующую ошибку

MultiValueDictKeyError at ... 'item-1-item'

(мой form prefix равен item, а также имеет поле с именем item)

Я подозреваю, что это потому, что django ищет следующий набор элементов формы для сопоставления с TOTAL_FORMS , но он не может найти нигде.

Что мне здесь не хватает?

Спасибо.

1 Ответ

0 голосов
/ 28 апреля 2018

Сначала я попробовал что-то около 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
...