2009-03-08 5 views
9

Je travaille sur une application Django. Un de mes modèles, « Utilisateur », comprend un champ « genre », tel que défini ci-dessous:Comment créer un élément de menu Django ModelForm sélectionné par défaut?

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

J'utilise un ModelForm pour générer un formulaire HTML « nouvel utilisateur ». Mon Google-fu semble me manquer - comment puis-je faire en sorte que ce formulaire HTML ait l'élément "Homme" sélectionné par défaut dans la liste déroulante? (c'est-à-dire selected="selected" pour cet article.)

Répondre

15

Si vous avez besoin d'un formulaire vierge avec une valeur par défaut sélectionnée, puis passez un dictionnaire « initial » au constructeur de votre formulaire de modèle en utilisant le nom de votre champ comme la clé:

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

-OU-

Vous pouvez remplacer certains attributs d'un ModelForm en utilisant la nature déclarative de l'API Forms. Cependant, c'est probablement un peu lourd pour ce cas d'utilisation et je le mentionne uniquement pour vous montrer que vous pouvez le faire. Vous pouvez trouver d'autres utilisations pour cela dans le futur.

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

-OU-

Si vous voulez un ModelForm qui est lié à une instance particulière de votre modèle, vous pouvez passer une « instance » de votre modèle qui provoque Django pour tirer la valeur sélectionnée de cette modèle.

form = MyModelForm (instance=someinst) 
+0

En fait, j'ai juste découvert que passer une instance du modèle comme vous l'avez fait dans votre réponse ne fait pas que Django affiche la valeur sélectionnée en HTML. Cela fonctionne très bien pour les champs de saisie de texte, mais j'en ai besoin aussi pour les entrées de sélection. Des idées sur la façon de contourner cela? – GChorn

+0

@GChorn Cela devrait aussi fonctionner pour certains champs, donc il peut y avoir quelque chose d'autre. Je vous recommande de créer une nouvelle question et de poster le code approprié afin que vous puissiez voir plus de gens. –

+0

Salut Joe, merci pour la réponse, oui, je l'ai fait hier, mais pas encore de réponses: http://stackoverflow.com/q/16056045/1256700 – GChorn

7

Sûrement default fera l'affaire?

par exemple.

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

+1; ça a marché aussi; Merci. – RexE