Django form init () a obtenu plusieurs valeurs pour l'argument de mot-clé
Bonjour, j'essaie d'utiliser une méthode de formulaire __init__
modifiée, mais je rencontre l'erreur suivante:
TypeError
__init__() got multiple values for keyword argument 'vUserProfile'
Je dois passer UserProfile
à mon formulaire, pour arriver au champ dbname
, et je pense que c'est une solution (mon code de formulaire):
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()
Les Appels au constructeur ClienteForm()
sans POST sont réussis et me montrent la forme correcte. Mais lorsque le formulaire est soumis et que le constructeur est appelé avec POST, j'obtiens l'erreur décrite précédemment.
3 réponses
Vous avez modifié la signature de la méthode __init__
du formulaire pour que vUserProfile
soit le premier argument. Mais ici:
formPessoa = ClienteForm(request.POST, instance=cliente, vUserProfile=profile)
Vous passez request.POST
comme premier argument - sauf que ce sera interprété comme vUserProfile
. Et puis vous essayez également de passer vUserProfile
comme un mot-clé arg.
Vraiment, vous devriez éviter de changer la signature de la méthode, et juste obtenir les nouvelles données de kwargs
:
def __init__(self, *args, **kwargs):
vUserProfile = kwargs.pop('vUserProfile', None)
Pour l'aide de ceux qui Google ici: l'erreur vient de init ramasser l'argument à la fois d'un argument positionnel et de l'argument par défaut. Daniel Roseman est précis pour la question posée.
Cela peut être:
-
Vous mettez l'argument par position, puis par mot-clé:
class C(): def __init__(self, arg): ... x = C(1, arg=2) # you passed arg twice!
-
Vous avez oublié de mettre
self
comme premier argument:class C(): def __init__(arg): ... x = C(arg=1) # but a position argument (for self) is automatically # added by __new__()!
Je pense que c'est le cas avec ModelForm, mais il faut vérifier. Pour moi, la solution était:
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()