2011-01-27 5 views
5

オブジェクト作成時にDjangoシグナル(例:post_saveまたはpost_initなど)を選択的に抑制するか、特定のパラメータを送信するかどうかは疑問です。Djangoでpost_save(またはその他の)シグナルを選択的に抑制することはできますか?

私が持っているものは、Userオブジェクトです。これは、さまざまな方法と場所で作成することができます。したがって、ProfileのカスタムオブジェクトをそれぞれUserに自動的に割り当てるには、post_saveシグナルを使用します。しかし、ある特定のケースでは、作成したProfileオブジェクトにバインドしたいという余分な情報があります。シグナルをpost_saveシグナルの引数として渡すことは素晴らしいことですが、見えません。

他のオプションは、手動でProfileオブジェクトを作成することですが、その後、私はそのUserが保存された後、それ以外ProfileUserインスタンスにバインドすることはできませんする必要があります。しかし、Userインスタンスを保存すると、信号によって呼び出される関数によって別のProfileが作成されます。

ちょうど作成されたProfileオブジェクトを取得することはできません。その結果、'Profile' object is unsubscriptableというエラーが発生します。何かアドバイス?

アップデート:ここで

が可能な状況の例である:私はそれを保存するcreateUserProfile方法にsignup方法で変数extra_paramを取得するにはどうすればよい

def createUserProfile(sender, instance, created, **kwargs): 
if created: 
    profile, created = Profile.objects.get_or_create(user=instance) 
    if extra_param: 
     profile.extra_param = extra_param 
    profile.save() 

post_save.connect(createUserProfile, sender=User) 

def signup(request): 
    ... 
    extra_param = 'param' 
    user.save() 

Profileオブジェクトの一部として

+1

+1。私はこれに対する答えを知りたいです。 – PeanutButterJelly

答えて

2

なぜこれはうまくいかないのですか?

user = User(...) 
user.save() 
# profile has been created transparently by post_save event 
profile = user.profile 
profile.extra_stuff = '...' 
profile.save() 

あなたは、イベント、可能ですが、悪に渡すパラメータと取りつかれている場合:

user = User() 
user._evil_extra_args = { ... } 
user.save() 

In event: 
extra_args = getattr(user, '_evil_extra_args', False) 

あなたのコードを読み込みます人々はいったいそれら_evil_extra_argsが何のためにあるのか分からないだろうので、それは悪であるとどのように機能するのですか?

+3

私は最後にevilオプションを使いました。最初のものは何らかの並行性エラーを出しています(dbオブジェクトは 'save()'イベントからロックされています。プロフィール)。 –

0

遅延post_saveentirely disconnect itが必要な場合を除き)遅延はありませんが、どちらも必要ありません。プロファイルにパラメータを渡すことはまったく問題になりません。

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    other = models.SomeField() 

def create_user_profile(sender, instance, created, other_param=None, **kwargs): 
    if created: 
     profile, created = UserProfile.objects.get_or_create(user=instance) 
     profile.other(other_param) # or whatever 
     profile.save() 

post_save.connect(create_user_profile, sender=User, other_param=p) 
+0

そのパラメータを1つのケースでのみ送信したい場合、 'post_save.connect'は' User'オブジェクト自体を作成する関数以外のどこかで定義されていますか?それはどのように機能しますか? –

+0

ちょうどそれにデフォルト値を与える...(編集の回答) –

+0

私は私たちの誰かが誤解していると思うので、問題を明確にするために私の質問に例を追加しました。 –

関連する問題