2009-04-17 4 views
51

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

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

form.cleaned_data["reason"] только даст мне «особенность» или «заказ» или так.

+1

Я думаю, вам, возможно, придется пересмотреть, какой ответ принят. –

+0

@ Dan: Почему? Какой из них вы предпочитаете? – webjunkie

+0

@webjunkie Тот, у кого больше голосов, тем больше django-centric, который требует меньше кода, написанного на основе каждой модели. –

ответ

57

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

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

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

+0

Есть ли какое-нибудь слово, если эта вещь сейчас является частью ядра? Непонятно, что это не в форме API, но у меня есть трудное время для поиска лучшего решения. –

103

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

ContactForm.get_reason_display() 

В шаблоне используется следующим образом:

{{ OBJNAME.get_FIELDNAME_display }} 
+29

Но это не модель, это форма. – webjunkie

+1

Да. Это справедливо только для моделей Django.Формы не подражают этому поведению (хотя теперь я желаю, чтобы они это сделали) ... –

+0

Это отлично подходит для моделей. Спасибо за подсказку. По-моему, для форм все еще нужно по-другому. – garromark

0

Я думаю, может быть @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() 
15

Этот самый простой способ сделать это: Model instance reference: Model.get_FOO_display()

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

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

+3

* NB * количество раз, когда вы укажете «модель» в своем ответе (3) и количество раз, когда @webjunkie упомянул об этом в вопросе (0). – supervacuo

+0

'selected_label = form.instance.get_FOO_display()' работает один –

6

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

chosen_label = form.instance.get_FOO_display() 
+0

Это будет работать только для ModelForm, вопрос не упоминает об этом. – Tuttle

2

Вы можете иметь свою форму, как это:

#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"]]