Подтвердить что ты не робот

Форма 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, я получаю ранее описанную ошибку.

4b9b3361

Ответ 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()