31

カスタムの post_save シグナルを配線していて、一連の kwargs を渡す簡単な方法が見つからないように見えることに気付きました。

保存中 (カスタム フォーム内)

def save(self, commit=True):
    user = super(CustomFormThing, self).save(commit=False)
    #set some other attrs on user here ...
    if commit:
        user.save()

    return user

次に、カスタムの post_save フック内に次のものがあります (ただし、kwargs を取得することはありません)。

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    some_id = kwargs.get('some', None)
    other_id = kwargs.get('other', None)

    if created:
        #do something with the kwargs above...

save イベントから post_save イベントに kwargs を渡すにはどうすればよいですか?

4

3 に答える 3

44

組み込みの信号はDjangoによって送信されるため、それらのkwargを制御することはできません。

あなたはできる:

  1. 独自の信号を定義して送信します。
  2. モデルインスタンスに追加情報を保存します。このような

    def save(self, commit=True):
        user = super(CustomFormThing, self).save(commit=False)
        #set some other attrs on user here ...
        user._some = 'some'
        user._other = 'other'
        if commit:
            user.save()
    
        return user
    
    @receiver(post_save, sender=User)
    def create_profile(sender, instance, created, **kwargs):
        some_id = getattr(instance, '_some', None)
        other_id = getattr(instance, '_other', None)
    
        if created:
            #do something with the kwargs above...
    
于 2012-04-24T13:49:05.887 に答える
2

別の kwargs のセットを渡す方法はないと思います。User属性に加えて、どのような引数が必要ですか? 引数Userのシグナル ハンドラで属性にアクセスできます。保存されたばかりのオブジェクトになります。instanceinstanceUser

他に伝えたいことがある場合は、instancearg を伝書鳩として使用してみてください。

def save(self, commit=True):
    user = super(CustomFormThing, self).save(commit=False)
    user.foo = 'bar'
    if commit:
        user.save()
    ...

次に、ハンドラーで次のようにします。

def create_profile(sender, instance, created, **kwargs):
    myfoo = instance.foo

しかし、上記はテストされておらず、うまくいくかどうかさえわかりません。

于 2012-04-24T13:46:36.500 に答える