Форма Django __init __() получила несколько значений для аргумента ключевого слова
Здравствуйте, я пытаюсь использовать модифицированный метод формы __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, я получаю ранее описанную ошибку.
Ответы
Ответ 1
Вы изменили подпись метода формы __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)
Ответ 2
Для помощи тех, кто Google здесь: ошибка возникает из init, набирает аргумент как из аргумента positional, так и из аргумента по умолчанию. Даниэль Роземан точно отвечает за вопрос, заданный.
Это может быть:
-
Вы помещаете аргумент по позиции, а затем по ключевому слову:
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__()!
Ответ 3
Я думаю, что это имеет место с 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()