Django

2012-07-21 14 views
6

में डायनामिक चॉइस फील्ड का उपयोग करना मेरे पास कुछ विकल्प के साथ एक चयन फ़ील्ड बनाने के लिए choiceField है। कुछ इस तरह:Django

forms.py 
    class NewForm(forms.Form): 
     title = forms.CharField(max_length=69) 
     parent = forms.ChoiceField(choices = CHOICE) 

लेकिन मैं एक पूर्वनिर्धारित टपल (जो ChoiceField के लिए आवश्यक है) बिना विकल्प बनाने में सक्षम होना चाहता हूँ। असल में, मुझे प्रत्येक उपयोगकर्ता के अनुसार कुछ विकल्प टैग भरने के लिए request.user तक पहुंच की आवश्यकता है, लेकिन मुझे नहीं पता कि फॉर्मों के वर्गों में अनुरोध का उपयोग करने का कोई तरीका है या नहीं।

एक वैकल्पिक माध्यम NewForm के कहने prepopulate करने के लिए होगा:

views.py 
form = NewForm(initial={'choices': my_actual_choices}) 

लेकिन मैं बनाने के लिए NewForm और my_actual_choices वैसे भी काम करने के लिए प्रतीत नहीं होता है एक डमी की पसंद में जोड़ने के लिए।

मुझे लगता है कि इसे हल करने का तीसरा तरीका ChoiceField का उप-वर्ग बनाना है और save() को फिर से परिभाषित करना है, लेकिन मुझे यकीन नहीं है कि यह करने के बारे में कैसे जाना है।

उत्तर

7

आप init अधिभावी द्वारा गतिशील रूप से उन्हें पॉप्युलेट कर सकते हैं, मूल रूप से कोड तरह दिखेगा:

class NewForm(forms.Form): 
    def __init__(self, choices, *args, **kwargs): 
     super(NewForm, self).__init__(*args, **kwargs) 
     self.fields["choices"] = forms.ChoiceField(choices=choices) 

NewForm(my_actual_choices) या NewForm(my_actual_choices, request.POST, request.FILES) आदि

+0

हां, यह काम करता है। धन्यवाद –

+1

'सुपर() 'पहले आना चाहिए। – Surya

+0

जब मैं निर्माता से पहले 'सुपर()' देखा तो मैं उलझन में था, लेकिन जब मैंने कोशिश की, मुझे एक त्रुटि मिली: नाम 'स्वयं' परिभाषित नहीं किया गया है। 'सुपर()' कन्स्ट्रक्टर में होना चाहिए। संपादन इतिहास को देखते हुए, मुझे लगता है कि सूर्य का अर्थ क्या है, क्योंकि 'सुपर() 'मूल रूप से निर्माता में अंतिम पंक्ति थी। – user2233706