2009-11-08 11 views
17

विशेष मामले मैं इस तरह है: from, to और amount (दोनों auth.User मॉडल के लिए ForeignKey रों हैं):django के मॉडलफॉर्म उदाहरण के लिए प्रारंभिक पैरामीटर कैसे पास करें?

मैं एक लेन-देन मॉडल, क्षेत्रों के साथ की है। मेरे रूप में, मैं उपयोगकर्ता 2 फ़ील्ड भरने के लिए प्रस्तुत करना चाहता हूं: amount और from (to स्वचालित रूप से दृश्य फ़ंक्शन में वर्तमान उपयोगकर्ता पर सेट हो जाएगा)।

ForeignKey प्रस्तुत करने के लिए डिफ़ॉल्ट विजेट एक चयन बॉक्स है। लेकिन मैं वहां क्या प्राप्त करना चाहता हूं, केवल user.peers क्वेरीसेट सदस्यों को विकल्पों को सीमित कर देता है (इसलिए लोग केवल अपने साथियों के साथ लेनदेन पंजीकृत कर सकते हैं और सभी सिस्टम उपयोगकर्ताओं के साथ बाढ़ नहीं कर सकते हैं)।

मैं कुछ इस तरह के ModelForm बदलने की कोशिश की:

class AddTransaction(forms.ModelForm): 
    from = ModelChoiceField(user.peers) 
    amount = forms.CharField(label = 'How much?') 

    class Meta: 
    model = models.Transaction 

लेकिन ऐसा लगता है मैं यहीं ModelChoiceField के लिए विकल्पों की क्वेरीसमूह पारित करने के लिए है - जहाँ मैं वेब request.user के लिए एक पहुँच नहीं है वस्तु।

मैं उपयोगकर्ता-निर्भर लोगों को किसी फ़ॉर्म में विकल्पों को कैसे सीमित कर सकता हूं?

उत्तर

29

निम्न विधि का उपयोग (उम्मीद यह काफी स्पष्ट है):

class BackupForm(ModelForm): 
    """Form for adding and editing backups.""" 

    def __init__(self, *args, **kwargs): 
     systemid = kwargs.pop('systemid') 
     super(BackupForm, self).__init__(*args, **kwargs) 
     self.fields['units'] = forms.ModelMultipleChoiceField(
       required=False, 
       queryset=Unit.objects.filter(system__id=systemid), 
       widget=forms.SelectMultiple(attrs={'title': _("Add unit")})) 

    class Meta: 
     model = Backup 
     exclude = ('system',) 

बनाएं इस तरह रूपों:

form_backup = BackupForm(request.POST, 
         instance=Backup, 
         systemid=system.id) 
form_backup = BackupForm(initial=form_backup_defaults, 
         systemid=system.id) 

आशा है कि मदद करता है! यदि आपको गहराई से अधिक व्याख्या करने की आवश्यकता है तो मुझे बताएं।

+0

बहुत बहुत धन्यवाद! यह वास्तव में मदद की। – kender

+4

फॉर्म क्लास के अंदर से आप 'self.instance' के माध्यम से मॉडल इंस्टेंस का उपयोग कर सकते हैं। याद रखें कि नया ऑब्जेक्ट जोड़ने/बनाने के दौरान इंस्टेंस रिक्त होगा। – JCotton

+2

थोड़ा सा सरल आपके __init __() में नियमित तर्क के रूप में सिस्टमिंग को पकड़ रहा है, जबकि ** kwargs को सीधे पास कर रहा है: 'def __init __ (स्वयं, systemid, * args, ** kwargs): सुपर (बैकअपफॉर्म, स्वयं) .__ init __ (* तर्क, ** kwargs) ' – JCotton

2

http://www.djangobook.com/en/2.0/chapter07/ में, खंड प्रारंभिक मान सेट करना बताता है कि कैसे Form निर्माता को initial पैरामीटर का उपयोग करने के लिए। आप अपने व्युत्पन्न Form की __init__ विधि में अतिरिक्त सामग्री भी कर सकते हैं।

+0

आरंभिक डेटा पास करने से मेरा चयन बॉक्स निर्दिष्ट मूल्य पर सेट होगा - विकल्पों को सीमित नहीं करेगा, या सत्यापन को संशोधित नहीं करेगा, जिसे मैं मॉडलफॉर्म परिभाषा में क्वेरीसेट सेट करने के साथ प्राप्त करूंगा। – kender

+0

आप अपने कन्स्ट्रक्टर में प्रारंभिक पैरामीटर (या कुछ अन्य पैरामीटर) का निरीक्षण कर सकते हैं और तदनुसार सीमा निर्धारित कर सकते हैं? –

6

मैं भी इस समस्या में पड़ गए, और यह मेरा समाधान था:

class ChangeEmailForm(forms.ModelForm): 
    def __init__(self, user, *args, **kwargs): 
     self.user = user 
     super(ChangeEmailForm, self).__init__(*args, **kwargs) 
     self.fields['email'].initial = user.email 

    class Meta: 
     model = User 
     fields = ('email',) 

    def save(self, commit=True): 
     self.user.email = self.cleaned_data['email'] 
     if commit: 
      self.user.save() 
     return self.user 
0

फार्म के __init__ में उपयोगकर्ता दर्रा, और फिर super(…) कहते हैं। फिर self.fields['from'].queryset से user.peers

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