Impostazione del valore selezionato su un Django forms.ChoiceField


106

Ecco la dichiarazione del campo in un modulo:

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

Vorrei impostare il valore iniziale su be 3e questo non sembra funzionare. Ho giocato con il parametro, le virgolette / senza virgolette, ecc ... ma nessuna modifica.

Qualcuno potrebbe darmi una risposta definitiva, se possibile? E / o la modifica necessaria nel mio frammento di codice?

Sto usando Django 1.0


Mi sono chiesto la stessa cosa. "iniziale" non sembra funzionare anche con le scelte nell'ultima versione del bagagliaio.
Ty.

Risposte:


114

Prova a impostare il valore iniziale quando crei un'istanza del modulo:

form = MyForm(initial={'max_number': '3'})

3
È '3'corrispondente al primo valore della tupla o la seconda?
Bestasttung

4
le tuple rappresentano le coppie (valore, etichetta) per le opzioni e si desidera specificare il valore iniziale, quindi il "3" si riferisce al primo elemento.
Tom

95

Questo non tocca la domanda immediata a portata di mano, ma questa domanda / risposta viene fuori per ricerche relative al tentativo di assegnare il valore selezionato a a ChoiceField.

Se hai già chiamato super().__init__nella tua classe Form, dovresti aggiornare il form.initialdizionario, non la field.initialproprietà. Se studi form.initial(es. print self.initialDopo la chiamata a super().__init__), conterrà valori per tutti i campi. Avere un valore di Nonein quel dict sovrascriverà il field.initialvalore.

per esempio

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'

3
se non capisci questa risposta, leggi questo django form
gotchas

1
Non sono sicuro che sia perché questa risposta è così vecchia che non funziona più, ma non sono in grado di far funzionare questa soluzione. Ho provato ogni combinazione di quanto sopra e ancora non ricevo amore. Ho posto di nuovo questa domanda qui: stackoverflow.com/questions/52191096/… Se la risposta è sempre la stessa, fammi sapere cosa c'è che non va nel mio codice. Grazie!
Lehrian

48

Puoi anche fare quanto segue. nel tuo modulo class def:

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

quindi quando si richiama il modulo nella propria visualizzazione è possibile impostare dinamicamente sia le scelte iniziali che l'elenco di scelte.

yourFormInstance = YourFormClass()

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

Nota: i valori iniziali devono essere un elenco e le scelte devono essere 2-tuple, nel mio esempio sopra ho un elenco di 2-tuple. Spero che questo ti aiuti.


5
Forse vale la pena notare che il valore di si initialriferisce alla chiave dell'elemento da selezionare, non al suo indice. Mi ci sono voluti un paio di tentativi per risolverlo!
BigglesZX

20

Mi sono imbattuto anche in questo problema e ho scoperto che il problema è nel browser. Quando si aggiorna, il browser ripopola il modulo con gli stessi valori di prima, ignorando il campo selezionato. Se visualizzi la sorgente, vedrai che il valore selezionato è corretto. Oppure posiziona il cursore nel campo dell'URL del browser e premi invio. Questo ricaricherà il modulo da zero.


1
solo per caso, questo accade ancora in FF6. La pressione del pulsante di aggiornamento non è sufficiente. Ma in Google Chrome il pulsante di aggiornamento è sufficiente, non è necessario andare alla barra degli indirizzi
mhd

1
Penso che succederà sempre in Firefox; è un comportamento previsto.
thepeer

Succede ancora in Chrome 83, mi hai salvato la vita amico!
lapin

7

Sia le risposte di Tom che quelle di Burton alla fine funzionano per me, ma ho avuto qualche problema a capire come applicarle a un file ModelChoiceField.

L'unico trucco è che le scelte sono memorizzate come tuple di (<model's ID>, <model's unicode repr>), quindi se vuoi impostare la selezione del modello iniziale, passi l' ID del modello come valore iniziale, non l'oggetto stesso o il suo nome o qualsiasi altra cosa. Quindi è semplice come:

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

In alternativa, l' initialargomento può essere ignorato al posto di una riga aggiuntiva con:

form.fields['manager'].initial = manager_employee_id

1
La seconda riga di codice funziona perfettamente in uno di quei rari casi in cui è necessario impostare il valore iniziale di un modulo dopo una GETrichiesta e impostarlo dall'interno di una vista.
kstratis

3

Dave - hai avuto fortuna nel trovare una soluzione al problema del browser? C'è un modo per forzare un aggiornamento?

Per quanto riguarda il problema originale, prova quanto segue durante l'inizializzazione del modulo:

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

1
Questo non sembra a posto. Citato da django 1.3, forms.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek

1

Per essere sicuro ho bisogno di vedere come stai visualizzando il modulo. Il valore iniziale viene utilizzato solo in un modulo non associato, se è associato e un valore per quel campo non è incluso, non verrà selezionato nulla.


-4

Prova questo per me funziona, l'ho aggiunto in models.py

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

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')

6
Questo dà un errore 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.