Как получить метку выбора в Django формах ChoiceField? - PullRequest
55 голосов
/ 17 апреля 2009

У меня есть ChoiceField, теперь, как мне получить «ярлык», когда он мне нужен?

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

form.cleaned_data["reason"] даст мне только «функцию» или «заказ» или около того.

Ответы [ 8 ]

114 голосов
/ 18 апреля 2009

См. Документы по Model.get_FOO_display () . Итак, должно быть что-то вроде:

ContactForm.get_reason_display()

В шаблоне используйте так:

{{ OBJNAME.get_FIELDNAME_display }}
69 голосов
/ 29 сентября 2011

Это может помочь:

reason = form.cleaned_data['reason']
reason = dict(form.fields['reason'].choices)[reason]
17 голосов
/ 06 марта 2012

Это самый простой способ сделать это: Ссылка на экземпляр модели: Model.get_FOO_display ()

Вы можете использовать эту функцию, которая будет возвращать отображаемое имя: ObjectName.get_FieldName_display()

Замените ObjectName именем вашего класса, а FieldName - полем, из которого вам нужно получить отображаемое имя.

6 голосов
/ 07 апреля 2012

Если экземпляр формы связан, вы можете использовать

chosen_label = form.instance.get_FOO_display()
4 голосов
/ 18 апреля 2009

Вот способ, который я придумал. Там может быть более простой способ. Я проверил это, используя 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

Примечание: это, вероятно, не очень Pythonic, но он показывает, где можно найти необходимые данные.

2 голосов
/ 09 мая 2012

Ваша форма может быть такой:

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

Тогда это даст вам то, что вы хотите:

reason = dict(CHOICES)[form.cleaned_data["reason"]]
0 голосов
/ 26 февраля 2019

Я использую @ Andrés Torres Marroquín, и я хочу поделиться своей реализацией.

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]

И результат this is paper вместо paper. Надеюсь, что эта помощь

0 голосов
/ 26 октября 2010

Я думаю, что, возможно, @webjunkie прав.

Если вы читаете из формы из POST, вы должны сделать

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...