2009-04-17 55 views
51

Bir ChoiceField'ım var, şimdi ihtiyacım olduğunda "etiketi" nasıl alabilirim?Django formlarında seçim etiketini nasıl alabilirim ChoiceField?

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

form.cleaned_data["reason"] bana sadece "özelliği" veya "düzen" ya da öylesine verecekti.

+1

Bence kabul edilen cevap hangisi olduğunu tekrar düşünmeniz gerekebilir .. –

+0

@Dan: Neden? Hangisini tercih ediyorsun? – webjunkie

+0

@webjunkie En fazla oyu alan kişi, model başına daha az kod gerektiren daha django merkezli bir programdır. –

cevap

3

İşte bir yol buldum. Daha kolay bir yol olabilir. Ben python manage.py shell kullanarak test:

>>> 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 

Not: Bu muhtemelen çok Pythonictir değil, ama ihtiyacınız veri bulunabilir nerede gösteriyor.

+0

Bu tür bir şeyin şu anda çekirdeklerin bir parçası olup olmadığı hakkında bir kelime var mı? Bunun form API'sinde olmadığı, ancak daha iyi bir çözüm için çaba sarf ettiğim bir şey olmadığının farkında değil. –

103

Model.get_FOO_display()'daki belgelere bakın. Yani, böyle bir şey olmalı: Bir şablonunda

ContactForm.get_reason_display() 

böyle kullanın:

{{ OBJNAME.get_FIELDNAME_display }} 
+29

Ama bu bir model değil, bir form. – webjunkie

+1

Yep. Bu sadece Django modelleri için geçerlidir.Formlar bu davranışa öykünme yapmazlar (şimdi yaptıklarını diliyorum). –

+0

Bu, modeller için harikadır. İpucu için teşekkür ederim. Sanırım formlar için hala farklı yapılması gerekiyor. – garromark

0

Ben @webjunkie haklı olabileceğini düşünüyorum. Bu yardımcı olabilir size POST formdan okuyorsanız

o zaman

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

Bu en kolay yolu Ekran adını döndüren bu işlevi kullanabilirsiniz: ObjectName.get_FieldName_display()

ObjectName'u sınıf adınızla ve FieldName ile değiştirin ve ekran adını getirmeniz gerekir. Form örneği bağlı ise,

chosen_label = form.instance.get_FOO_display() 
+3

* NB * cevabınızdaki "model" ten kaç kez bahsettiğinizi (3) ve @webjunkie sorgusundaki soru sayısı (0). – supervacuo

+0

'selected_label = form.instance.get_FOO_display()' bir tane çalışıyor –

6

:

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

O zaman bu istediğini verecekti:

reason = dict(CHOICES)[form.cleaned_data["reason"]] 
+0

Bu sadece ModelForm için çalışır, soru bundan bahsetmez. – Tuttle

2

Böyle formunuzu olabilir kullanabilirsiniz

İlgili konular