2012-04-24 15 views
19

私はカスタムpost_save信号を配線しています.kwargのセットを渡す簡単な方法が見つからないようです。 (カスタムフォーム内)自体を保存kwargsをsaveからpost_saveに渡す方法

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... 

がどのように私はkwargsからを渡すかもしれませんpost_saveイベントへの保存から?

+0

のように私は(Djangoのユーザー自体から分離された)ユーザー・プロファイルに住んで、他の引数(非ユーザー属性)を渡すに興味があります。ポスト・セービングは、これを達成するための素晴らしい場所のように思えました...私は外部変数を得ることはできません。私はあなたの提案を試み、それがうまくいくとポストバックします(post_save信号そのものの** kwargsを利用したいのですが) –

+0

私はここでシグナルは良い考えではないと思います。シグナルは、オブジェクトがコードの異なる部分で作成されている場合(アプリ外でも可能)に適しています。しかし、あなたのケースでは、オブジェクトがフォームの外で作成されていれば、シグナルは役に立たなくなります。だから私は最も合理的な方法は、フォームの保存で直接 'User'とプロファイルを作成することだと思います。実装が簡単で、後でコードを理解しやすい。 – DrTyrsa

+0

私は、ほとんどの人(大丈夫、たぶん私:)は、PostProcess()ではなく、オーバーライドされたsave()メソッドでUserProfileの作成と操作を行うと信じています。しかし、あなたの要件は異なるかもしれません。いずれにしても、プロファイルがすでに作成されていて、それが役立つ場合は、post_saveで 'instance.get_profile()'を呼び出すこともできます。 – alan

答えて

28

ビルトイン信号はDjangoによって送信されるため、kwargsは制御できません。あなたがすることができ

  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... 
    
+0

+1より良い答えが私のものです。私はgetattr()の使用を考えていたはずです。また、 'instance'を使って追加の属性を渡すことができることを確認してください。 – alan

+0

'user.save()'の後に 'self.save_m2m()'を呼び出すのはどうですか?それは必要ではありませんか? – thnee

2

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

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

:あなたが一緒に渡したい他のものがある場合は

が、私はあなたが伝書鳩としてinstance引数を使用するように試みることができると仮定し

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

しかし、上記はテストされておらず、私はそれが動作するかどうかはわかりません。

関連する問題