2 Stimmen

Kombinieren von unterklassifizierten Modellformen zum übergeordneten Modell

Ich verwende den Formularassistenten von Django für eine Umfrage, und ich möchte die gesamte Umfrage in einem einzigen Modell speichern. Ich habe das Modell in mehrere Formulare aufgeteilt, um eine Teilmenge des Modells in jedem FormWizard-Schritt zu haben. Die Frage ist, wie ich sie am Ende wieder zusammenführe. Meine models.py sieht wie folgt aus:

class BigSurvey(models.Model):
    field1 = models.TextField()
    field2 = models.TextField()
    ...
    field40 = models.CharField(max_length=10)

und meine forms.py sieht folgendermaßen aus:

class FirstPageForm(ModelForm):
    class Meta:
        model = BigSurvey
        fields = ('field1', 'field2')

class SecondPageForm(ModelForm):
    class Meta:
        model = BigSurvey
        fields = ('field3', 'field4')

Und so weiter, für vier Formulare und insgesamt 30 Felder. Die Felder der einzelnen unterklassifizierten Modellformulare entsprechen zusammengenommen allen Feldern des BigSurvey-Modells.

Dies ermöglicht es mir, die BigSurvey in vier Schritte aufzuteilen. Der Formularassistent gibt ein Objekt form_list zurück, das eine Liste der vier Formulare ist (FirstPageForm, SecondPageForm usw.).

Wie kann ich diese vier Formulare in einem einzigen BigSurvey-Objekt zusammenfassen und speichern?

UPDATE: Gelöst durch Iteration über Formulare und Felder und Auffüllen eines neuen Formulars mit einem Wörterbuch von Werten. Die Befüllung mit setattr (wie in Colleens Antwort unten) führt zu einem ungebundenen Formular. Meine Arbeitslösung:

newvalues={}
for form in form_list:
    for field in form.cleaned_data.keys():
        newvalues[field]=form.cleaned_data[field]   
newform = QuestForm(newvalues)
newform.save()

1voto

Colleen Punkte 22159

Sie könnten alle Felder in den einzelnen Formularen durchlaufen und den Werten BigSurvey-Felder zuweisen.

bg = BigSurvey()

for form in form_list
    for field in form.cleaned_data.keys():
        setattr(bg, field, form.cleaned_data[field])

bg.save()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X