2009-04-10 2 views
5

के विकल्प को संशोधित चलो कहते हैं कि मैं कुछ काल्पनिक मॉडल करते हैं करने के लिए:कैसे ModelMultipleChoiceField

class Author(Model): 
    name = CharField() 

class Book(Model): 
    title = CharField() 
    author = ForeignKey(Author) 

और मान लें कि मैं पुस्तक के लिए एक ModelForm का उपयोग करना चाहते हैं:

class BookForm(ModelForm): 
     class Meta: 
     model = Book 

सरल अब तक। लेकिन आइए यह भी कहें कि मेरे डेटाबेस में लेखकों का एक टन है, और मैं इतना लंबा विकल्प नहीं चाहता हूं। इसलिए, मैं चाहता हूं कि BookForm के ModelMultipleChoiceField लेखक फ़ील्ड पर क्वेरीसेट को प्रतिबंधित करना है। आइए यह भी कहें कि मैं चाहता हूं कि क्वेरीसेट __init__ तक नहीं चुना जा सकता है, क्योंकि यह पारित होने के लिए एक तर्क पर निर्भर करता है।

यह लगता है जैसे कि यह चाल हो सकती:,

class BookForm(ModelForm): 
    class Meta: 
     model = Book 

    def __init__(self, letter): 
     # returns the queryset based on the letter 
     choices = getChoices(letter) 
     self.author.queryset = choices 
बेशक

कि अगर सिर्फ काम मैं यहाँ नहीं होगा। यह मुझे एक विशेषता त्रुटि प्राप्त करता है। 'बुकफॉर्म' ऑब्जेक्ट में कोई विशेषता 'लेखक' नहीं है।

class BookForm(ModelForm): 
    author = ModelMultipleChoiceField(queryset=Author.objects.all()) 

    class Meta: 
     model = Book 

    def __init__(self, letter): 
     choices = getChoices(letter) 
     self.author.queryset = choices 

कौन सा एक ही परिणाम का उत्पादन: तो, मैं भी कुछ इस तरह है, जहां मैं ModelForm के डिफ़ॉल्ट क्षेत्र ओवरराइड करने के लिए और फिर इसे बाद में सेट की कोशिश की कोशिश की।

कोई भी जानता है कि यह कैसे किया जाना है? के रूप में विशेषताओं, आप "क्षेत्रों" विशेषता है, जो एक शब्दकोश है में देखने की जरूरत है

उत्तर

8

फार्म वस्तुओं को अपने खेतों की जरूरत नहीं है:

self.fields['author'].queryset = choices 

आप पूरी तरह से समझने के लिए यहां हो रहा है चाहते हैं, आप this answer में रुचि हो सकती है - यह मॉडल के बारे में है, लेकिन फॉर्म समान रूप से काम करते हैं।

7

हालांकि कार्ल खेतों के बारे में सही है, तो आप एक सुपर क्लास कॉल भी खो रहे हैं। इस तरह मैं इसे करता हूं:

class BookForm(ModelForm): 
    author = ModelMultipleChoiceField(queryset=Author.objects.all()) 

    class Meta: 
     model = Book 

    def __init__(self, *args, **kwargs): 
     letter = kwargs.pop('letter') 
     super(BookForm, self).__init__(*args, **kwargs) 
     choices = getChoices(letter) 
     self.fields['author'].queryset = choices 
+0

हाँ, मेरे वास्तविक समस्या क्षेत्र में सुपर क्लास कॉल है, लेकिन मैंने इसे इस उदाहरण के लिए छोड़ दिया। – Brian

+0

पर्याप्त मेला। मैं इसे किसी भी व्यक्ति के लिए छोड़ दूंगा जो संदर्भ के लिए इस प्रश्न में घूमता है, मुझे लगता है। –

+1

निश्चित रूप से। यह देखना महत्वपूर्ण है कि सुपर() .__ init __() फ़ील्ड तक पहुंच से पहले होने की आवश्यकता है। – Brian