2013-01-14 20 views
21

हैलो, मैं एक संशोधित __init__ प्रपत्र विधि का उपयोग करने की कोशिश कर रहा हूँ, लेकिन मैं निम्नलिखित त्रुटि का सामना कर रहा हूँ:Django रूप __init __() कीवर्ड तर्क के लिए अनेक मान मिला

TypeError 
__init__() got multiple values for keyword argument 'vUserProfile' 

मैं UserProfile पास करनी होगी मेरी फार्म के लिए, dbname क्षेत्र को पाने के लिए, और मुझे लगता है कि यह एक समाधान (मेरे प्रपत्र कोड) है:

class ClienteForm(ModelForm): 
class Meta: 
    model = Cliente 

def __init__(self, vUserProfile, *args, **kwargs): 
    super(ClienteForm, self).__init__(*args, **kwargs) 
    self.fields["idcidade"].queryset = Cidade.objects.using(vUserProfile.dbname).all() 

कॉल पोस्ट बिना ClienteForm() निर्माता को सफल और थानेदार रहे हैं मुझे सही रूप में डब्ल्यू। लेकिन जब फॉर्म सबमिट किया जाता है और निर्माता को POST के साथ बुलाया जाता है, तो मुझे पहले वर्णित त्रुटि मिलती है।

उत्तर

39

आपने फ़ॉर्म की __init__ विधि का हस्ताक्षर बदल दिया है ताकि vUserProfile पहला तर्क हो। लेकिन यहाँ:

formPessoa = ClienteForm(request.POST, instance=cliente, vUserProfile=profile) 

आप पहली बार तर्क के रूप में request.POST पास - सिवाय इसके कि इस vUserProfile के रूप में व्याख्या की जाएगी। और फिर आप कीवर्ड तर्क के रूप में vUserProfile पास करने का भी प्रयास करते हैं।

वास्तव में, आप विधि हस्ताक्षर बदल रहा से बचना चाहिए, और सिर्फ kwargs से नए डेटा प्राप्त करें: त्रुटि init उठा से आता है: उन दूसरों की मदद करते हैं कि Google यहाँ करने के लिए

def __init__(self, *args, **kwargs): 
    vUserProfile = kwargs.pop('vUserProfile', None) 
+0

बहुत बहुत धन्यवाद! ठीक काम करता है .. मैं हस्ताक्षर रहता हूं डिफ़ॉल्ट है .. और अपनी टिप का उपयोग करें ... –

+0

मुझे अब कोई समस्या है .. मैं इस कोड को एक इनलाइनफॉर्मसेट_फैक्टरी में कैसे पास कर सकता हूं? –

31

एक स्थितित्मक तर्क और डिफ़ॉल्ट तर्क दोनों से तर्क। पूछे जाने वाले प्रश्न के लिए डैनियल रोज़मैन सटीक है।

यह हो सकता है या तो:

  1. आप कीवर्ड के अनुसार स्थिति से तर्क रखा और फिर:

    class C(): 
        def __init__(arg): ... 
    
    x = C(arg=1) # but a position argument (for self) is automatically 
           # added by __new__()! 
    
  2. :

    class C(): 
        def __init__(self, arg): ... 
    
    x = C(1, arg=2) # you passed arg twice! 
    
  3. आप self पहले तर्क के रूप में लगाना भूल गए

0

मुझे लगता है कि यह मॉडलफॉर्म के साथ मामला है, लेकिन जांच करने की आवश्यकता है। मेरे लिए, समाधान था:

def __init__(self, *args, **kwargs): 
    self.vUserProfile = kwargs.get('vUserProfile', None) 
    del kwargs['vUserProfile'] 
    super(ClienteForm, self).__init__(*args, **kwargs) 
    self.fields["idcidade"].queryset = Cidade.objects.using(self.vUserProfile.dbname).all() 

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

  • कोई संबंधित समस्या नहीं^_^