Festlegen des ausgewählten Werts in einem Django-Formular.ChoiceField

106

Hier ist die Felddeklaration in einer Form:

max_number = forms.ChoiceField(widget = forms.Select(), 
    choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

Ich möchte den Anfangswert auf setzen 3und dies scheint nicht zu funktionieren. Ich habe mit dem Parameter, Anführungszeichen / keine Anführungszeichen usw. herumgespielt, aber keine Änderung.

Könnte mir jemand eine endgültige Antwort geben, wenn es möglich ist? Und / oder die notwendige Optimierung in meinem Code-Snippet?

Ich benutze Django 1.0

thebiglife
quelle
Ich habe mich das Gleiche gefragt. "initial" funktioniert auch in der neuesten Trunk-Version nicht mit Auswahlmöglichkeiten.
Ty.

Antworten:

114

Versuchen Sie, den Anfangswert festzulegen, wenn Sie das Formular instanziieren:

form = MyForm(initial={'max_number': '3'})
Tom
quelle
3
Entspricht '3'der erste Wert des Tupels oder der zweite?
Bestasttung
4
Die Tupel stellen (Wert, Beschriftung) Paare für die Optionen dar und Sie möchten den Anfangswert angeben. Die '3' bezieht sich also auf das erste Element.
Tom
95

Dies berührt nicht die unmittelbare Frage, aber diese Frage / Antwort wird für Suchvorgänge im Zusammenhang mit dem Versuch, den ausgewählten Wert einem zuzuweisen, angezeigt ChoiceField.

Wenn Sie super().__init__Ihre Form-Klasse bereits aufgerufen haben , sollten Sie das form.initialWörterbuch und nicht die field.initialEigenschaft aktualisieren . Wenn Sie studieren form.initial(z. B. print self.initialnach dem Aufruf von super().__init__), enthält es Werte für alle Felder. Ein Wert von Nonein diesem Diktat überschreibt den field.initialWert.

z.B

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        # assign a (computed, I assume) default value to the choice field
        self.initial['choices_field_name'] = 'default value'
        # you should NOT do this:
        self.fields['choices_field_name'].initial = 'default value'
Colinta
quelle
3
Wenn Sie diese Antwort nicht verstehen, lesen Sie diese Django Form Fallstricke
ChillarAnand
1
Ich bin mir nicht sicher, ob dies daran liegt, dass diese Antwort so alt ist, dass sie nicht mehr funktioniert, aber ich kann diese Lösung nicht zum Laufen bringen. Ich habe jede Kombination der oben genannten ausprobiert und trotzdem bekomme ich keine Liebe. Ich habe diese Frage hier erneut gestellt: stackoverflow.com/questions/52191096/… Wenn die Antwort immer noch dieselbe ist, lassen Sie mich bitte wissen, was mit meinem Code nicht stimmt. Danke dir!
Lehrian
48

Sie können auch Folgendes tun. in deiner Form Klasse def:

max_number = forms.ChoiceField(widget = forms.Select(), 
                 choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

Wenn Sie dann das Formular in Ihrer Ansicht aufrufen, können Sie sowohl die anfänglichen Auswahlmöglichkeiten als auch die Auswahlliste dynamisch festlegen.

yourFormInstance = YourFormClass()

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)]
yourFormInstance.fields['max_number'].initial = [1]

Hinweis: Die Anfangswerte müssen eine Liste sein und die Auswahl muss 2-Tupel sein. In meinem obigen Beispiel habe ich eine Liste von 2-Tupeln. Hoffe das hilft.

Burton Williams
quelle
5
Es ist vielleicht erwähnenswert, dass sich der Wert von initialauf den Schlüssel des auszuwählenden Elements bezieht, nicht auf dessen Index. Ich habe ein paar Versuche unternommen, um das herauszufinden!
BigglesZX
20

Ich bin auch auf dieses Problem gestoßen und habe herausgefunden, dass das Problem im Browser liegt. Wenn Sie aktualisieren, füllt der Browser das Formular erneut mit denselben Werten wie zuvor und ignoriert das aktivierte Feld. Wenn Sie die Quelle anzeigen, sehen Sie, dass der aktivierte Wert korrekt ist. Oder setzen Sie den Cursor in das URL-Feld Ihres Browsers und drücken Sie die Eingabetaste. Dadurch wird das Formular von Grund auf neu geladen.

Dave
quelle
1
Nur zu Ihrer Information, das passiert immer noch in FF6. Das Drücken der Aktualisierungstaste reicht nicht aus. Aber in Google Chrome Refresh Button ist genug, keine Notwendigkeit, zur Adressleiste zu gehen
mhd
1
Ich denke, dass es in Firefox immer passieren wird. es ist beabsichtigtes Verhalten.
Thepeer
Kommt immer noch in Chrome 83 vor, du hast mein Leben gerettet, Mann!
Lapin
7

Die Antworten von Tom und Burton funktionieren schließlich für mich, aber ich hatte ein wenig Probleme herauszufinden, wie ich sie auf a anwenden kann ModelChoiceField.

Der einzige Trick besteht darin, dass die Auswahlmöglichkeiten als Tupel von gespeichert (<model's ID>, <model's unicode repr>)werden. Wenn Sie also die anfängliche Modellauswahl festlegen möchten, übergeben Sie die Modell- ID als Anfangswert, nicht das Objekt selbst oder dessen Namen oder etwas anderes. Dann ist es so einfach wie:

form = EmployeeForm(initial={'manager': manager_employee_id})

Alternativ kann das initialArgument anstelle einer zusätzlichen Zeile ignoriert werden mit:

form.fields['manager'].initial = manager_employee_id
orlade
quelle
1
Ihre zweite Codezeile funktioniert in einem der seltenen Fälle einwandfrei, in denen Sie den Anfangswert eines Formulars nach einer GETAnforderung festlegen und in einer Ansicht festlegen müssen.
Kstratis
3

Dave - haben Sie Glück, eine Lösung für das Browserproblem zu finden? Gibt es eine Möglichkeit, eine Aktualisierung zu erzwingen?

Versuchen Sie beim Initialisieren des Formulars Folgendes für das ursprüngliche Problem:

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value

quelle
1
Das sieht nicht gut aus. Zitiert aus Django 1.3, forms.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek
1

Um sicherzugehen, muss ich sehen, wie Sie das Formular rendern. Der Anfangswert wird nur in ungebundener Form verwendet, wenn er gebunden ist und ein Wert für dieses Feld nicht enthalten ist, wird nichts ausgewählt.

Andrew Wilkinson
quelle
-4

Versuchen Sie dies, es funktioniert für mich, ich habe dies in models.py hinzugefügt

options = (
    ('1','1'),
    ('2','2'),
    ('3','3')
)

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')
abhijeetmote
quelle
6
Dies gibt einen Fehler in Django 1.8.1: TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'
Juliocesar