Django - UpdateView mit Inline-Formsätzen, die versuchen, doppelte Datensätze zu speichern?

8

Ich habe ein Expense Modell und ein ExpenseLineItem Modell. Wie bei einer typischen Ausgabe / Rechnung kann eine Ausgabe mehrere Werbebuchungen enthalten, die die Gesamtkosten einer Rechnung ausmachen. Ich versuche, klassenbasierte Ansichten zu verwenden, um Ausgaben zu erstellen und zu aktualisieren. Ich habe CreateView erfolgreich codiert, um eine neue Ausgabe mit mehreren Werbebuchungen zu erstellen.

Mein Problem ist, wenn ich versuche, eine vorhandene Ausgabe zu aktualisieren, die bereits mehrere Werbebuchungen enthält. Hier ist mein Code unten, und ich kann nicht herausfinden, was das Problem ist. Die Mixins ( TitleMixin , CancelSuccessMixin , SelectedApartment ) gehören mir und funktionieren gut.

Ich erhalte einen Fehler, der, glaube ich, bedeutet, dass versucht wird, eine neue Kopie von ExpenseLineItems zu speichern, aber fehlschlägt, da diese bereits existiert. Fast so, als würde ich kein instance -Argument liefern.

Was mache ich falsch?

forms.py

%Vor%

Hier ist mein ExpenseUpdate view:

%Vor%

Fehlercode bekomme ich:

%Vor%

Bearbeiten : Relevanter Teil meiner Vorlage:

%Vor%

BEARBEITEN - Arbeitsformularvorlage Ich dachte, ich würde die Arbeitsversion meiner Vorlage hinzufügen, falls jemand anders sie benötigt:

%Vor%     
Garfonzo 14.09.2015, 23:40
quelle

1 Antwort

4

Sie müssen die Formular-ID für jedes Formular in das Formularset einschließen (es wird dem Benutzer nicht angezeigt, da es als versteckte Eingabe gerendert wird). Ohne dieses Formular fehlt der Wert in den POST-Daten und Sie erhalten eine KeyError , wie Sie sehen.

Aus der Formularsatz-Dokumentation :

  

Beachten Sie, dass wir {{ form.id }} explizit darstellen müssen. Dadurch wird sichergestellt, dass das Modell-Formset im POST-Fall ordnungsgemäß funktioniert. (In diesem Beispiel wird ein Primärschlüssel namens id vorausgesetzt. Wenn Sie Ihren eigenen Primärschlüssel explizit als id definiert haben, stellen Sie sicher, dass er gerendert wird.)

In Ihrem Fall durchlaufen Sie das Formularset mit {% for eli in expense_line_item_form %} , daher müssen Sie {{ eli.id }} einschließen.

    
Alasdair 15.09.2015, 13:42
quelle