2013-01-14 11 views
21

Witam, Próbuję użyć zmodyfikowanego __init__ metodę formy, ale jestem napotyka się następujący błąd:Django forma __init __() dostał wiele wartości dla argumentu słowa kluczowego

TypeError 
__init__() got multiple values for keyword argument 'vUserProfile' 

muszę przechodzić UserProfile do mojego formularza, aby dostać się do dbname dziedzinie, i myślę, że jest to rozwiązanie (mój kod forma):

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

apeluje do konstruktora ClienteForm() bez POST są udane i sho we mnie poprawna forma. Ale kiedy formularz zostanie przesłany, a konstruktor zostanie wywołany z POST, otrzymam opisany wcześniej błąd.

Odpowiedz

39

Zmieniono sygnaturę metody formularza __init__ tak, aby vUserProfile był pierwszym argumentem. Ale tutaj:

formPessoa = ClienteForm(request.POST, instance=cliente, vUserProfile=profile) 

zdać request.POST jako pierwszy argument - chyba, że ​​zostanie to zinterpretowane jako vUserProfile. A następnie próbujesz przekazać vUserProfile jako słowo kluczowe arg.

Naprawdę, należy unikać zmieniania podpis metody, a po prostu nowe dane z kwargs:

def __init__(self, *args, **kwargs): 
    vUserProfile = kwargs.pop('vUserProfile', None) 
+0

Dziękuję bardzo! działa teraz dobrze .. Pozostaję podpis jest domyślny .. i użyj swojej wskazówki ... –

+0

Mam inny problem teraz .. jak mogę przekazać ten kod do jednego inlineformset_factory? –

31

Za pomocą tych innych, którzy Google tutaj: błąd pochodzi init, dowieziono argument zarówno z argumentu pozycyjnego, jak i argumentu domyślnego. Daniel Roseman jest dokładny w odniesieniu do zadawanego pytania.

Może to być:

  1. umieścić argument za miejsce, a następnie według słów kluczowych:

    class C(): 
        def __init__(self, arg): ... 
    
    x = C(1, arg=2) # you passed arg twice! 
    
  2. zapomniałeś umieścić self jako pierwszy argument:

    class C(): 
        def __init__(arg): ... 
    
    x = C(arg=1) # but a position argument (for self) is automatically 
           # added by __new__()! 
    
0

Myślę, że tak jest w przypadku ModelForm, ale trzeba to sprawdzić. Dla mnie rozwiązaniem było:

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() 
Powiązane problemy