2009-04-17 8 views
51

J'ai un ChoiceField, maintenant comment obtenir le "label" quand j'en ai besoin?Comment obtenir l'étiquette d'un choix dans un formulaire Django ChoiceField?

class ContactForm(forms.Form): 
    reason = forms.ChoiceField(choices=[("feature", "A feature"), 
             ("order", "An order")], 
           widget=forms.RadioSelect) 

form.cleaned_data["reason"] ne ferait que me donner "fonction" ou "ordre" ou si.

+1

Je pense que vous devrez peut-être reconsidérer quelle réponse est acceptée. –

+0

@Dan: Pourquoi? lequel préfères-tu? – webjunkie

+0

@webjunkie Celui qui a le plus de votes est le plus centré sur le django qui nécessite moins de code écrit sur une base par modèle. –

Répondre

57

Cela peut aider:

reason = form.cleaned_data['reason'] 
reason = dict(form.fields['reason'].choices)[reason] 
3

Voici comment je suis arrivé. Il peut y avoir un moyen plus facile. Je l'ai testé à l'aide python manage.py shell:

>>> cf = ContactForm({'reason': 'feature'}) 
>>> cf.is_valid() 
True 
>>> cf.fields['reason'].choices 
[('feature', 'A feature')] 
>>> for val in cf.fields['reason'].choices: 
...  if val[0] == cf.cleaned_data['reason']: 
...    print val[1] 
...    break 
... 
A feature 

Note: Ceci est probablement pas très Pythonic, mais il montre où les données dont vous avez besoin peut être trouvé.

+0

Y at-il un mot sur si ce genre de chose fait partie du noyau maintenant? Il est insondable que ce n'est pas dans la forme API mais j'ai du mal à googler pour une meilleure solution. –

103

Voir les documents sur Model.get_FOO_display(). Alors, devrait être quelque chose comme:

ContactForm.get_reason_display() 

Dans un modèle, utilise comme ceci:

{{ OBJNAME.get_FIELDNAME_display }} 
+29

Mais ce n'est pas un modèle, c'est une forme. – webjunkie

+1

Oui. Cela ne vaut que pour les modèles Django.Les formes n'émulent pas ce comportement (bien que maintenant je le souhaite) ... –

+0

C'est parfait pour les modèles. Merci pour l'indice. Je suppose que cela doit encore être fait différemment pour les formes. – garromark

0

Je pense que peut-être @webjunkie est juste.

Si vous lisez de la forme d'un POST alors vous ne

def contact_view(request): 
    if request.method == 'POST': 
     form = ContactForm(request.POST) 
     if form.is_valid(): 
      contact = form.save() 
      contact.reason = form.cleaned_data['reason'] 
      contact.save() 
15

Cette façon la plus simple de le faire: Model instance reference: Model.get_FOO_display()

Vous pouvez utiliser cette fonction qui renverra le nom d'affichage: ObjectName.get_FieldName_display()

Remplacez ObjectName par votre nom de classe et FieldName par le champ dont vous avez besoin pour récupérer le nom d'affichage de.

+3

* NB * le nombre de fois que vous mentionnez "modèle" dans votre réponse (3) et le nombre de fois que @webjunkie l'a mentionné dans la question (0). – supervacuo

+0

'chosen_label = form.instance.get_FOO_display()' fonctionne un –

6

Si l'instance de formulaire est lié, vous pouvez utiliser

chosen_label = form.instance.get_FOO_display() 
+0

Cela ne fonctionnerait que pour ModelForm, la question ne mentionne pas cela. – Tuttle

2

Vous pouvez avoir votre formulaire comme ceci:

#forms.py 
CHOICES = [('feature', "A feature"), (order", "An order")] 
class ContactForm(forms.Form): 
    reason = forms.ChoiceField(choices=CHOICES, 
           widget=forms.RadioSelect) 

Ensuite, cela vous donne ce que vous voulez:

reason = dict(CHOICES)[form.cleaned_data["reason"]] 
Questions connexes