2014-12-17 3 views
0

Я создал счет и элементы в нем, используя Modelform и inlineforset_factory. Теперь я пытаюсь создать форму редактирования, но я получаю MultiValueDictKeyError, когда я пытаюсь редактировать эти встроенные поля. Если я просто создаю новые inlineformsets, я могу редактировать Modelform просто отлично. После одного часа поиска в Google я не собираюсь найти решение.Редактирование inlineformsets, связанных с родительской формой

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

ответ

0

Итак, я обнаружил, что проблема не в view.py и в forms.py, а в шаблоне. Потому что я создал шаблон без использования {{form.as_p/table/...}} В форме были некоторые дополнительные входы - DELETE, ID и foreignKey ... после добавления их в цикл for, все работает отлично :)

0

У вас есть две переменные, 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) 

Сообщите мне, если это сработает для вас.

+0

К сожалению, он делает именно то, что случилось со мной, когда я пытаюсь представить его. MultiValueDictKeyError с «u'item_set-0-id». Я подозреваю, что по какой-то причине они не редактируются, а заменяются. Я пытаюсь по-другому ... удалить все элементы в выбранном счете и добавить их заново ... Я новичок в stackoverflow, я дам, я должен сообщить вам, добавив комментарий, надеясь, что он будет правильным. Спасибо – MarKay

+0

Спасибо, что дайте мне знать. Извините, это не сработало для вас: - / – dustinfarris

Смежные вопросы