2011-03-16 10 views
48

मैं Models में एक Django फार्म वर्ग परिभाषित इस पसंद है:Django ModelChoiceField: एक वस्तु के रूप क्वेरी की स्थापना की और स्थापित करने के लिए डिफ़ॉल्ट मान को छानने

class AccountDetailsForm(forms.Form): 
    ... 
    adminuser = forms.ModelChoiceField(queryset=User.objects.all()) 

यह ठीक काम करता है, लेकिन यह कुछ सीमाएं मैं नहीं कर पा रहे है आस-पास काम:

(1) मैं क्वेरीसमूह पर एक फिल्टर, एक चर accountid प्रपत्र के लिए पारित पर आधारित है, इस तरह उपयोग करना चाहते हैं:

User.objects.filter(account=accountid) 

यह मॉडल में काम नहीं कर सकता है क्योंकि accountid निश्चित रूप से एक चर के रूप में पारित नहीं किया जा सकता है।

यह इस प्रकार है कि queryset को किसी भी तरह Views में परिभाषित किया जाना चाहिए, लेकिन जहां तक ​​मैं देख सकता हूं कि यह फॉर्म क्लास में एक आवश्यक फ़ील्ड है।

(2) मैं AccountDetailsForm डेटाबेस में एक वस्तु है, जो मैं Views इस तरह में चुन सकते हैं के डिफ़ॉल्ट विकल्प बनाने के लिए करना चाहते हैं:

User.objects.filter(account=accountid).filter(primary_user=1) 

मैं एक डिफ़ॉल्ट के रूप में adminuser निर्दिष्ट करने की कोशिश की है के रूप में मूल्य, (जो, अन्य मानक प्रपत्र फ़ील्ड्स के साथ काम करता CharField की तरह):

adminuser = User.objects.filter(account=accountid).filter(primary_user=1) 

... 

form = AccountDetailsForm({'adminuser': adminuser}) 
return render_to_response('accounts/edit/accountdetails.html', 
{'form': form, 'account':account}) 

लेकिन कोई भाग्य।

क्या मुझे यहां लचीलापन देने के लिए ModelChoiceField के अलावा कुछ और उपयोग करना चाहिए?

धन्यवाद।

उत्तर

91

अवहेलना init विधि और एक नया कीवर्ड तर्क

class AccountDetailsForm(forms.Form): 
    ... 
    adminuser = forms.ModelChoiceField(queryset=User.objects.all()) 
    def __init__(self, *args, **kwargs): 
     accountid = kwargs.pop('accountid', None) 
     super(AccountDetailsForm, self).__init__(*args, **kwargs) 

     if accountid: 
      self.fields['adminuser'].queryset = User.objects.filter(account=accountid) 

form = AccountDetailsForm(accountid=3) 

तुम हमेशा सिर्फ विकल्प मैन्युअल रूप से ध्यान में रखते हुए और साथ ही निर्धारित कर सकते हैं स्वीकार करते हैं।

form = AccountDetailsForm() 
form.fields['adminuser'].queryset = User.objects.filter(account=accountid) 

चेतावनी दी हो: यदि आप अपने उदाहरण की तरह एक फार्म करने के लिए एक शब्दकोश में पास करके नहीं सेटिंग डिफ़ॉल्ट मान रहे हैं।

आप वास्तव में एक बाउंड फॉर्म बना रहे हैं, संभावित रूप से सत्यापन और सभी जैज़ को ट्रिगर कर रहे हैं।

डिफ़ॉल्ट सेट करने के लिए, use the initials argument.

form = AccountDetailsForm(initial={'adminuser':'3'}) 
+0

हाय में क्षेत्र ओवरराइड कर सकते हैं, आपके उत्तर के लिए धन्यवाद। दृश्य में क्वेरीसेट सेट करना अच्छी तरह से काम किया। जिस भाग को मैं काम नहीं कर सका, वह मॉड्यूल चॉइसफ़ील्ड के _User.objects.filter (account = accountid) के रूप में बाध्य फॉर्म मान (डिफ़ॉल्ट के बजाए) सेट कर रहा है। फिल्टर (primary_user = 1) _। धन्यवाद। – eli

6

आप दृश्य

yourForm = AccountDetailsForm() 

yourForm.fields['accomodation'] = forms.ModelChoiceField(User.objects.filter(account=accountid).filter(primary_user=1)) 
संबंधित मुद्दे