2013-01-14 61 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是成功的,笑用我的正確形式。但是當表單被提交併且用POST調用構造函數時,我得到了前面描述的錯誤。

回答

39

您已更改表格的__init__方法的簽名,因此vUserProfile是第一個參數。但在這裏:

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

傳遞request.POST作爲第一個參數 - 除了這將被解釋爲vUserProfile。然後,您還嘗試將vUserProfile作爲關鍵字arg。

真的,你應該避免改變方法簽名,並從kwargs剛剛得到的新數據:

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

非常感謝!現在工作正常..我留簽名是默認..並使用您的提示... –

+0

我現在有其他問題..我怎麼可以將此代碼傳遞給一個inlineformset_factory? –

31

對於別人的幫助誰谷歌在這裏:誤差來源於初始化回升來自位置參數和默認參數的參數。丹尼爾羅斯曼對於所問的問題是準確的。

這可以是:

  1. 您可以通過位置把參數,然後通過關鍵詞:

    class C(): 
        def __init__(self, arg): ... 
    
    x = C(1, arg=2) # you passed arg twice! 
    
  2. 你忘了把self作爲第一個參數:

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

我認爲這是ModelForm的情況,但需要檢查。對我來說,解決方案是:

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() 
相關問題