2009-04-17 16 views
51

मेरे पास चॉइसफ़िल्ल्ड है, अब मुझे इसकी आवश्यकता होने पर "लेबल" कैसे प्राप्त होगा?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

क्या इस बात की कोई बात है कि इस तरह की चीज अब कोर का हिस्सा है? यह अतुलनीय है कि यह फॉर्म एपीआई में नहीं है, फिर भी मुझे एक बेहतर समाधान के लिए कठिन समय है। –

103

Model.get_FOO_display() पर दस्तावेज़ देखें। तो, की तरह कुछ किया जाना चाहिए:

ContactForm.get_reason_display() 

एक टेम्पलेट में, इस तरह का उपयोग करें:

{{ OBJNAME.get_FIELDNAME_display }} 
+29

लेकिन यह एक मॉडल नहीं है, यह एक रूप है। – webjunkie

+1

हाँ। यह केवल Django मॉडल के लिए सच है।फॉर्म इस व्यवहार का अनुकरण नहीं करते हैं (हालांकि अब मैं चाहता हूं कि वे ऐसा करें) ... –

+0

यह मॉडल के लिए बहुत अच्छा है। संकेत के लिए धन्यवाद। मुझे लगता है कि इसे अभी भी रूपों के लिए अलग-अलग किया जाना चाहिए। – garromark

0

मैं शायद लगता है @webjunkie सही है।

आप किसी पोस्ट से फार्म से पढ़ रहे हैं तो आप

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

अपने कक्षा के नाम और FieldName के साथ ObjectName को बदलें जिसके क्षेत्र में आपको प्रदर्शन का नाम प्राप्त करने की आवश्यकता है।

+3

* एनबी * आपके उत्तर में "मॉडल" का उल्लेख करने की संख्या (3) और @webjunkie ने प्रश्न (0) में इसका उल्लेख किया है। – supervacuo

+0

'selected_label = form.instance.get_FOO_display()' एक काम कर रहा है –

6

प्रपत्र उदाहरण ही है, तो आप उपयोग कर सकते हैं

chosen_label = form.instance.get_FOO_display() 
+0

यह केवल मॉडलफॉर्म के लिए काम करेगा, सवाल का उल्लेख नहीं है। – 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"]] 
संबंधित मुद्दे