Django表单__init __()获得了关键字参数的多个值

时间:2013-01-14 16:12:05

标签: django-forms

您好,我正在尝试使用修改后的__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()

在没有POST的情况下调用构造函数ClienteForm()成功并向我显示正确的表单。但是当提交表单并使用POST调用构造函数时,我得到了前面描述的错误。

3 个答案:

答案 0 :(得分:43)

您已更改了表单__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)

答案 1 :(得分:32)

有关Google其他人的帮助:错误来自 init 从位置参数和默认参数中获取参数。丹尼尔罗斯曼对这个问题的准确性是准确的。

这可以是:

  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__()!
    

答案 2 :(得分:1)

我认为这是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()