29

こんにちは、変更されたフォームメソッドを使用しようとして__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()

POSTを使用しないコンストラクターの呼び出しClienteForm()は成功し、正しい形式が表示されます。しかし、フォームが送信され、コンストラクターがPOSTで呼び出されると、前述のエラーが発生します。

4

3 に答える 3

49

フォームの__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)
于 2013-01-14T16:15:07.880 に答える
32

ここにグーグルする他の人の助けのために:エラーは、位置引数とデフォルト引数の両方から引数を拾うinitから来ます。ダニエル・ローズマンは、尋ねられた質問に対して正確です。

これは次のいずれかになります。

  1. 引数を位置ごとに配置し、次にキーワードごとに配置します。

    class C():
      def __init__(self, arg): ...
    
    x = C(1, arg=2)   # you passed arg twice!  
    
  2. selfあなたは最初の議論として置くのを忘れました:

    class C():
       def __init__(arg):  ...
    
    x = C(arg=1)   # but a position argument (for self) is automatically 
                   # added by __new__()!
    
于 2013-07-26T00:23:42.507 に答える
1

これは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()
于 2013-12-15T23:53:21.450 に答える