web-dev-qa-db-fra.com

Comment obtenir l'étiquette d'un choix dans un formulaire Django ChoiceField?

J'ai un ChoiceField, maintenant comment obtenir le "label" quand j'en ai besoin?

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

form.cleaned_data["reason"] me donnerait seulement "fonctionnalité" ou "commande" ou plus.

54
webjunkie

Cela peut aider:

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

Voir la documentation sur Model.get_FOO_display () . Donc, devrait être quelque chose comme:

ContactForm.get_reason_display()

Dans un modèle, utilisez comme ceci:

{{ OBJNAME.get_FIELDNAME_display }}
110
shacker

Voici le moyen le plus simple de procéder: Référence d'instance de modèle: Model.get_FOO_display ()

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

Remplacez ObjectName par votre nom de classe et FieldName par le champ dont vous devez extraire le nom complet.

17
Kumar

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

chosen_label = form.instance.get_FOO_display()
6
krubo

Voici une façon dont je suis venu avec. Il peut y avoir un moyen plus facile. Je l'ai testé en utilisant 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

Remarque: ce n'est probablement pas très Pythonic, mais cela montre où les données dont vous avez besoin peuvent être trouvées.

4
Ryan Duffield

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 donnerait ce que vous voulez:

reason = dict(CHOICES)[form.cleaned_data["reason"]]
2
Akshar Raaj

J'utilise @ Andrés Torres Marroquín, et je veux partager mon implémentation. 

GOOD_CATEGORY_CHOICES = (
    ('paper', 'this is paper'),
    ('glass', 'this is glass'),
    ...
)

class Good(models.Model):
    ...
    good_category = models.CharField(max_length=255, null=True, blank=False)
    ....

class GoodForm(ModelForm):
    class Meta:
        model = Good
        ...

    good_category = forms.ChoiceField(required=True, choices=GOOD_CATEGORY_CHOICES)
    ...


    def clean_good_category(self):
        value = self.cleaned_data.get('good_category')

        return dict(self.fields['good_category'].choices)[value]

Et le résultat est this is paper au lieu de paper. J'espère que cela vous aidera

0
Ardi Nusawan

Je pense que @webjunkie a peut-être raison.

Si vous lisez le formulaire à partir d’un POST], vous ferez 

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()
0
Noel Evans