2009-06-22 15 views
0

Grundsätzlich habe ich ein Modell mit einem ManyToMany-Feld, und dann eine Modellform von diesem Modell abgeleitet, wo das Feld als "Multiple-Choice" -Auswahlfeld gerendert wird. In meiner Vorlage habe ich dieses Feld weggelassen und stattdessen gewählt, um die Werte für dieses Feld in der Ansicht vorzubereiten, dann übergebe diese vorbereiteten Werte an request.POST (eigentlich eine Kopie von request.POST, weil request.POST unveränderlich ist) Fütterung Anfrage.POST auf das Formular und dann weiter wie gewohnt. Ich kann mir nicht vorstellen, wie das geht, denn request.POST ist nicht einfach ein einfaches Python-Wörterbuch, sondern ein QueryDict, das sich etwas anders verhält.Wie erstelle ich einen benutzerdefinierten "list-type" -Eintrag zur Anfrage.POST

Das Feld, das ich ausfüllen muss, heißt "not_bases". Wenn ich das Widget unter Verwendung des Formulars erstelle, funktioniert es intern sehr gut, aber nicht auf meine Weise UI-mäßig. Als ich die django-Formular abgeschickt POST Wert über Djangos handliche Debug-Fehlerfenster überprüfen, sieht die Arbeits QueryDict wie folgt aus:

<QueryDict: {u'not_bases': [u'005', u'00AR', u'00F', u'00FD'], [...] }> 

es den Wert für "not_bases" erscheint eine Liste, aber es ist nicht einfach eine Liste. Ich kann nicht einfach .append(), weil es nicht funktioniert. Ich grub um die Dokumentation und fand .update(), die erscheint funktioniert, aber nicht. Hier ist mein Code:

newPOST = request.POST.copy() 
for base in bases: 
    newPOST.update({"not_bases": base.identifier}) 

und hier ist die Ausgabe:

<QueryDict: {u'not_bases': [u'KMER', u'KYIP'], u'reference': [u''], [...] }> 

Aber wenn ich füttern, dass QueryDict auf die Form, erhalte ich eine Form Validierungsfehler, der sagt „not_bases: Geben Sie eine Liste von Werte.". Es ist offensichtlich, dass die listenähnlichen Dinge, die aus der str() -Darstellung des QueryDict kommen, in den beiden obigen Fällen nicht identisch sind, obwohl sie genau gleich aussehen.

Also, wie mache ich das?

+0

Wenn mein Verständnis des Quellcodes korrekt ist, sollten Sie in der Lage sein, .append() zur not_bases-Liste hinzuzufügen. Können Sie bitte klarstellen, was Sie mit "es wird nicht funktionieren" meinen? –

+0

Hacking request.POST ist der falsche Weg, um Ihr Ziel zu erreichen. Ändern Sie stattdessen Ihr Formular, so dass es dieses Feld nicht erfordert, aber den Wert manuell in dem gespeicherten Modell (oder was auch immer Ihr Formular mit den Posted-Daten tut) setzt. –

Antwort

2

Es ist wirklich nicht klar, was Sie hier versuchen, aber ich bezweifle, dass Hacker das QueryDict ist der richtige Weg, um es zu erreichen.

Wenn Sie versuchen, die Anzeige des not_bases Feld anpassen, können Sie einfach die Definition in Ihrer Modelform Deklaration außer Kraft setzen:

class MyModelForm(forms.ModelForm): 
    not_bases = forms.ChoiceField(choices=[(base, base) for base in bases]) 

    class Meta: 
     model = MyModel 

Oder, wenn Sie einfach vermeiden wollen es auf dem Formular zeigt, Sie kann es aus dem Formular ausschließen und den Wert nach der Validierung festlegen.

class MyModelForm(forms.ModelForm): 

    class Meta: 
     model = MyModel 
     exclude = ['not_bases'] 


.... 
if request.POST: 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.not_bases = bases 
     instance.save() 

Tut einer dieser beiden, was Sie wollen?

+0

I mein tatsächlicher Code, ich habe "not_bases" sowie ungefähr 5 andere "XXX_bases" Felder. Der Catch ist, dass ein Base-Objekt nur in einem einzigen dieser Felder existieren kann. Um dies zu tun, habe ich die Form nicht die "XX_fields" zu zeichnen und stattdessen meine eigenen Radio-Buttons. Ich schrieb ein wenig Code, der meine benutzerdefinierten Felder in den POST-Daten durchläuft, und erstellt für jedes Feld eine Liste. Ich könnte _ sie nach einem commit hinzufügen = False, aber während ich Schleifen und Erstellen von Listen, warum nicht nur hinzufügen, um request.POST? Spart nur einen Schritt ... – priestc

Verwandte Themen