您好,我正在尝试使用修改后的__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调用构造函数时,我得到了前面描述的错误。
答案 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 从位置参数和默认参数中获取参数。丹尼尔罗斯曼对这个问题的准确性是准确的。
这可以是:
您按位置放置参数,然后按关键字:
class C():
def __init__(self, arg): ...
x = C(1, arg=2) # you passed arg twice!
您忘记将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()