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.

22
demandé sur dsalaj 2013-01-14 20:12:04

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)
40
répondu Daniel Roseman 2013-01-14 16:15:07

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:

  1. 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!  
    
  2. 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__()!
    
32
répondu Charles Merriam 2013-07-26 00:23:42

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()
0
répondu alekwisnia 2013-12-15 23:53:21