2009-03-08 5 views
9

Sto lavorando ad un'applicazione Django. Uno dei miei modelli, "Utente", comprende un campo "di genere", come definito di seguito:Come si imposta una voce di menu Django ModelForm selezionata per impostazione predefinita?

GENDER_CHOICES = (
     ('M', 'Male'), 
     ('F', 'Female'), 
    ) 
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, null=True) 

Sto usando un ModelForm per generare un modulo HTML "nuovo utente". Sembra che il mio Google-mi stia fallendo: come posso fare in modo che questo modulo HTML abbia l'elemento "Maschio" selezionato per impostazione predefinita nella casella a discesa? (Ad esempio, selected="selected" per questo articolo.)

risposta

15

Se avete bisogno di un modulo in bianco con un valore predefinito selezionato, quindi passare un dizionario di 'prima' al costruttore del modulo modello utilizzando il nome del campo come chiave:

form = MyModelForm (initial={'gender':'M'}) 

-OR-

È possibile ignorare determinati attributi di un ModelForm utilizzando la natura dichiarativa dell'API di moduli. Tuttavia, questo è probabilmente un po 'macchinoso per questo caso d'uso e lo accenno solo per mostrarti che puoi farlo. Potresti trovare altri usi per questo in futuro.

class MyModelForm (forms.ModelForm): 
    gender = forms.ChoiceField (choices=..., initial='M', ...) 
    class Meta: 
     model=MyModel 

OPPURE

Se si desidera un ModelForm che è destinato a una particolare istanza del modello, è possibile passare un 'istanza' del modello che provoca Django a tirare il valore selezionato da quel modello.

form = MyModelForm (instance=someinst) 
+0

In realtà ho appena scoperto che passare un'istanza del modello come nella tua risposta non fa in modo che Django mostri il valore selezionato in HTML. Funziona bene per i campi di inserimento del testo, ma ho bisogno anche per selezionare l'input. Qualche idea su come aggirare questo? – GChorn

+0

@GChorn Dovrebbe funzionare anche per i campi selezionati, quindi potrebbe esserci qualcosa di diverso. Consiglierei di creare una nuova domanda e di pubblicare il codice pertinente in modo da poter dare più gente a dare un'occhiata. –

+0

Ciao Joe, grazie per la risposta, sì, in realtà l'ho fatto ieri ma non ho ancora risposto: http://stackoverflow.com/q/16056045/1256700 – GChorn

7

Sicuramente default farà il trucco?

ad es.

gender = models.CharField(max_length=1, choices=GENDER_CHOICES, default='M', null=True)
+0

+1; anche quello ha funzionato; Grazie. – RexE