2009-03-23 29 views
15

मुझे एक साधारण प्रश्न के साथ परेशानी हो रही है: मॉडलफॉर्म और पसंद के माध्यम से उत्पन्न ड्रॉपडाउन मेनू में कुछ "अक्षम" फ़ील्ड कैसे करें django फ्रेमवर्क में स्थित है?विकल्प फ़ील्ड के लिए "अक्षम" विकल्प - Django

पल में, मैं समझ नहीं इस तरह के एक उत्पादन प्राप्त करने के लिए कैसे: - रूट 1 प्रविष्टि - (अक्षम) - ईएलटी 1 - (विकलांग नहीं) - रूट 2 प्रविष्टि - (अक्षम)

क्या आपके पास कोई सलाह है?

पियरे

उत्तर

16

Django के रूप विगेट्स विशेषताओं <option> टैग पर रेंडर किया जाना चाहिए की एक सूची पारित करने के लिए एक तरीका प्रदान:

my_choices = (('one', 'One'), ('two', 'Two')) 
class MyForm(forms.Form): 
    some_field = forms.ChoiceField(choices=my_choices, 
            widget=forms.Select(attrs={'disabled':'disabled'})) 

दुर्भाग्य से, यह आप के लिए काम नहीं करेगा क्योंकि विशेषता लागू किया जाएगा प्रदान किए जाने वाले प्रत्येक विकल्प टैग के लिए। Django के पास स्वचालित रूप से यह जानने का कोई तरीका नहीं है कि कौन सा सक्षम होना चाहिए और जिसे अक्षम किया जाना चाहिए।

आपके मामले में, मैं एक कस्टम विजेट लिखने की सलाह देता हूं। यह करना बहुत आसान है, और आपके पास आवेदन करने के लिए इतना कस्टम तर्क नहीं है। इस पर दस्तावेज़ here हैं। हालांकि संक्षेप में:

  • उपवर्ग forms.Select, जो डिफ़ॉल्ट रेंडरर
  • अपने उपवर्ग में चुनिंदा है, render(self, name, value, attrs) विधि को लागू। यह निर्धारित करने के लिए कि value अक्षम होने की आवश्यकता के रूप में योग्यता प्राप्त करने के लिए अपने कस्टम तर्क का उपयोग करें। यदि आपको उल्लंघन की आवश्यकता है तो django/forms/widgets.py में render के बहुत कम कार्यान्वयन पर नज़र डालें।

फिर, अपने कस्टम विजेट का उपयोग करने के लिए अपने प्रपत्र फ़ील्ड निर्धारित:

class MyForm(forms.Form): 
    some_field = forms.ChoiceField(choices=my_choices, 
            widget=MyWidget) 
+1

यह एक बहुत ही अच्छा समाधान है, लेकिन उचित विधि विकल्प 'विशेषताओं को बदलने के लिए है 'render_option() साफ हो जाएगा है' 'नहीं प्रस्तुत करना() '(जो पूरे विजेट को प्रस्तुत करता है) – jnns

3

आप एक मेनू है, जिसमें सूची आइटम श्रेणियों में विभाजित कर रहे हैं बनाने के लिए कोशिश कर रहे हैं, और आप श्रेणियों के लिए खुद को चयन होने के लिए नहीं करना चाहते?

यदि ऐसा है, तो आप टैग का उपयोग करके अपने टेम्पलेट को फ़ील्ड प्रस्तुत करके इसे प्राप्त कर सकते हैं, उदा।

<select name="my_field" id="id_my_field"> 
<optgroup label="-- Root 1 entry --"> 
    <option value="1">Elt 1</option> 
    <option value="2">Elt 2</option> 
    <option value="3">Elt 3</option> 
</optgroup> 
<optgroup label="--- Root 2 entry ---"> 
    <option value="4">Elt 4</option> 
    <option value="5">Elt 5</option> 
</optgroup> 
</select> 
4

यह Django 1.1 लगता है "optgroup" की अनुमति देगा: Django documentation

class MyForm(forms.Form): 
    some_field = forms.ChoiceField(choices=[ 
     ('Audio', (
       ('vinyl', 'Vinyl'), 
       ('cd', 'CD'), 
      ) 
     ), 
     ('Video', (
       ('vhs', 'VHS Tape'), 
       ('dvd', 'DVD'), 
      ) 
     ), 
     ('unknown', 'Unknown'), 
    ]) 

यह imho एक होना आवश्यक है।

4

आप इस तरह ब्रायन द्वारा उल्लिखित विकल्पों को बना सकते हैं। नीचे दिए गए विकल्पों रूट 1 में, रूट 2 स्वचालित रूप से अक्षम हैं और वे समूह विकल्प

CHOICES = (
    ('-- Root 1--', 
     (
     ('ELT1', 'ELT1'), 
     ('ELT2', 'ELT2'), 
     ('ELT3', 'ELT3'), 
    ) 
    ), 
    ('-- Root 2--', 
     (
     ('ELT3', 'ELT3'), 
     ('ELT4', 'ELT4'), 
    ) 
), 
) 

ऊपर विकल्प इस तरह प्रदर्शित करेगा की तरह दिखाई देगा। नीचे दी गई छवि में, रूट 1 और रूट 2 चयन योग्य नहीं हैं।

enter image description here

आशा इससे आपकी समस्या का

-Vikram

संबंधित मुद्दे