2013-01-14 14 views
21

Ciao, sto cercando di utilizzare una versione modificata __init__ form method, ma sto incontrando il seguente errore:Django forma __init __() ha ottenuto più valori per argomento chiave

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

ho bisogno di passare UserProfile alla mia forma, per arrivare a dbname campo, e penso che questa è una soluzione (il mio codice del modulo):

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

chiede al costruttore ClienteForm() senza POST sono riuscito e sho w me la forma corretta. Ma quando il modulo viene inviato e il costruttore viene chiamato con POST, ottengo l'errore precedentemente descritto.

risposta

39

Hai modificato la firma del metodo __init__ del modulo in modo che vUserProfile sia il primo argomento. Ma ecco:

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

si passa request.POST come primo argomento - solo che questo sarà interpretato come vUserProfile. E poi prova anche a passare vUserProfile come parola chiave arg.

Davvero, si dovrebbe evitare di modificare la firma del metodo, e solo ottenere i nuovi dati da kwargs:

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

Grazie mille! funziona bene ora .. sto fermo firma è default .. e uso il tuo suggerimento ... –

+0

Ho un altro problema ora .. come posso passare questo codice a uno inlineformset_factory? –

31

Per l'aiuto di quegli altri che Google a qui: l'errore viene da init raccogliendo l'argomento sia da un argomento posizionale che dall'argomento predefinito. Daniel Roseman's è preciso per la domanda come richiesto.

Questo può essere:

  1. Hai messo la tesi in base alla posizione e poi per parola chiave:

    class C(): 
        def __init__(self, arg): ... 
    
    x = C(1, arg=2) # you passed arg twice! 
    
  2. Hai dimenticato di mettere self come primo argomento:

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

Penso che questo sia il caso di ModelForm, ma è necessario controllare. Per me la soluzione era:

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