किसी Django रूपों पर चयनित मान सेट करना। ChoiceField


106

यहाँ एक रूप में क्षेत्र की घोषणा है:

max_number = forms.ChoiceField(widget = forms.Select(), 
    choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

मैं होने के लिए प्रारंभिक मूल्य निर्धारित करना चाहता हूं 3और यह काम नहीं करता है। मैंने परम के साथ खेला है, उद्धरण / कोई उद्धरण नहीं, आदि ... लेकिन कोई बदलाव नहीं।

किसी ने मुझे एक निश्चित जवाब दे सकता है अगर यह संभव है? और / या मेरे कोड स्निपेट में आवश्यक ट्विस्ट?

मैं Django 1.0 का उपयोग कर रहा हूं


मैं एक ही बात सोच रहा हूँ। "प्रारंभिक" नवीनतम ट्रंक संस्करण में विकल्पों के साथ काम करने के लिए सीवन नहीं करता है।
टाइ।

जवाबों:


114

जब आप फ़ॉर्म को तुरंत शुरू करते हैं तो प्रारंभिक मूल्य निर्धारित करने का प्रयास करें:

form = MyForm(initial={'max_number': '3'})

3
है '3'टपल या दूसरे के पहले मान के संगत?
बेस्टस्टांग

4
tuples विकल्पों के लिए (मान, लेबल) जोड़े का प्रतिनिधित्व करते हैं और आप प्रारंभिक मूल्य निर्दिष्ट करना चाहते हैं - इसलिए '3' पहले आइटम को संदर्भित करता है।
टॉम

95

यह तात्कालिक प्रश्न पर स्पर्श नहीं करता है, लेकिन यह क्यू / ए उन खोजों के लिए आता है जो चयनित मान को असाइन करने की कोशिश कर रहा है ChoiceField

यदि आपने पहले ही super().__init__अपनी फॉर्म क्लास में कॉल किया है, तो आपको form.initialशब्दकोश को अपडेट करना चाहिए , न कि field.initialसंपत्ति को। यदि आप अध्ययन करते हैं form.initial(जैसे print self.initialकॉल के बाद super().__init__), तो इसमें सभी फ़ील्ड के मान शामिल होंगे । Noneउस तानाशाह का एक मूल्य होने से मूल्य अधिक हो जाएगा field.initial

जैसे

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        # assign a (computed, I assume) default value to the choice field
        self.initial['choices_field_name'] = 'default value'
        # you should NOT do this:
        self.fields['choices_field_name'].initial = 'default value'

3
अगर आपको यह उत्तर समझ में नहीं आ रहा है, तो इस django form gotchas को
ChillarAnand

1
मुझे यकीन नहीं है अगर यह है क्योंकि यह जवाब इतना पुराना है कि यह अब काम नहीं करता है, लेकिन मैं इस समाधान को काम करने में असमर्थ हूं। मैंने ऊपर के हर संयोजन की कोशिश की है और फिर भी मुझे कोई प्यार नहीं मिला। मैंने यह प्रश्न यहां फिर से पूछा है: stackoverflow.com/questions/52191096/… यदि उत्तर अभी भी वही है, तो कृपया मुझे बताएं कि मेरे कोड में क्या गलत है। धन्यवाद!
लेहियन

48

आप निम्न कार्य भी कर सकते हैं। अपने फार्म में कक्षा डीफ़:

max_number = forms.ChoiceField(widget = forms.Select(), 
                 choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

तब जब आपके विचार में फॉर्म को कॉल किया जाता है तो आप गतिशील रूप से प्रारंभिक विकल्प और विकल्प सूची दोनों को सेट कर सकते हैं।

yourFormInstance = YourFormClass()

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)]
yourFormInstance.fields['max_number'].initial = [1]

नोट: प्रारंभिक मानों की एक सूची होनी चाहिए और विकल्प 2-ट्यूपल होने चाहिए, ऊपर मेरे उदाहरण में 2-ट्यूपल्स की एक सूची है। उम्मीद है की यह मदद करेगा।


5
शायद यह ध्यान देने योग्य है कि initialआइटम की कुंजी को संदर्भित करने का मूल्य उसके सूचकांक नहीं है। मुझे यह काम करने की कोशिश करता है की एक जोड़ी ले लिया!
BigglesZX

20

मैं इस समस्या में भी भाग गया, और यह पता लगा लिया कि समस्या ब्राउज़र में है। जब आप रीफ़्रेश करते हैं तो ब्राउज़र चेक किए गए फ़ील्ड को अनदेखा करते हुए फॉर्म को पहले की तरह ही मानों के साथ फिर से आबाद कर रहा है। यदि आप स्रोत देखते हैं, तो आप देखेंगे कि चेक किया गया मान सही है। या अपने कर्सर को अपने ब्राउज़र के URL फ़ील्ड में डालें और एंटर करें। वह स्क्रैच से फॉर्म को फिर से लोड करेगा।


1
बस फी, यह अभी भी FF6 में होता है। रिफ्रेश बटन को दबाना पर्याप्त नहीं है। लेकिन गूगल क्रोम रिफ्रेश बटन में पर्याप्त है, एड्रेस बार पर जाने की कोई जरूरत नहीं है
mdd

1
मुझे लगता है कि यह हमेशा फ़ायरफ़ॉक्स में होगा; यह व्यवहार का इरादा है।
thepeer

अभी भी Chrome 83 में होता है, आपने मेरा जीवन बचा लिया!
लैपिन

7

टॉम और बर्टन के उत्तर दोनों मेरे लिए अंततः काम करते हैं, लेकिन मुझे यह समझने में थोड़ी परेशानी हुई कि उन्हें कैसे लागू किया जाए ModelChoiceField

इसके लिए एकमात्र चाल यह है कि विकल्पों को ट्यूपल्स के रूप में संग्रहीत किया जाता है (<model's ID>, <model's unicode repr>), इसलिए यदि आप प्रारंभिक मॉडल चयन सेट करना चाहते हैं, तो आप मॉडल की आईडी को प्रारंभिक मूल्य के रूप में पास करते हैं , न कि ऑब्जेक्ट को स्वयं या यह नाम या कुछ और। फिर यह उतना ही सरल है:

form = EmployeeForm(initial={'manager': manager_employee_id})

वैकल्पिक रूप से initialतर्क को एक अतिरिक्त पंक्ति के स्थान पर अनदेखा किया जा सकता है:

form.fields['manager'].initial = manager_employee_id

1
कोड की आपकी दूसरी पंक्ति उन दुर्लभ मामलों में से एक में त्रुटिपूर्ण रूप से काम करती है, जहाँ आपको किसी GETअनुरोध के बाद किसी प्रपत्र का प्रारंभिक मान सेट करने और उसे किसी दृश्य में सेट करने की आवश्यकता होती है।
कुस्तटिस

3

डेव - किसी भी भाग्य ब्राउज़र की समस्या का हल ढूंढ रहा है? क्या रिफ्रेश को मजबूर करने का कोई तरीका है?

मूल समस्या के लिए, फ़ॉर्म को प्रारंभ करते समय निम्नलिखित प्रयास करें:

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value

1
यह अच्छी तरह से नहीं दिखता है। Django 1.3 से उद्धृत किया गया, form.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
टॉमस टोमसेक

1

यह सुनिश्चित करने के लिए कि मुझे यह देखने की आवश्यकता है कि आप फ़ॉर्म कैसे प्रस्तुत कर रहे हैं। प्रारंभिक मान केवल एक अनबाउंड रूप में उपयोग किया जाता है, अगर यह बाध्य है और उस फ़ील्ड के लिए एक मूल्य शामिल नहीं है तो कुछ भी नहीं चुना जाएगा।


-4

यह मेरे लिए काम करता है की कोशिश करो, मैंने इसे मॉडल-थ्रेड में जोड़ा है

options = (
    ('1','1'),
    ('2','2'),
    ('3','3')
)

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')

6
यह django 1.8.1 में एक त्रुटि देता है: TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'
juliocesar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.