2013-01-14 43 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() 
相关问题