2011-01-16 37 views
1

ちょっと、 私のモデルで信号pre_saveを動作させようとしていますが、 は外部キーなどで何らかの問題があるようです。私のモデルは、このような です:Django:シグナルコールバック関数がモデルに外国語がありません

class BlogEntry(models.Model): 
    headline = models.CharField(max_length=100) 
    content = models.CharField(max_length=2000) 
    written_by = models.ForeignKey(User) 
    date = models.DateTimeField(auto_now=True) 
    project = models.ForeignKey(Project) 

そして、ここではフォームが処理され、保存される場所です。

def form_valid(self, blogform): # post a blogentry 
     blog_entry = blogform.save(commit=False) 
     blog_entry.written_by = self.request.user 
     blog_entry.project = blog_entry.project #debugging shows that this 
    is a valid instance of the Project model 
     blog_entry.save() 

    return TemplateResponseMixin.render_to_response(self, 
self.get_context_data()) 

そして、ここは私の信号レシーバ機能が

@receiver(post_save, sender=BlogEntry) 
def project_blog_entry_signal(sender, **kwargs): 
    log = Log() 
    log.project = sender.project.field 
    log.content_type = Log.content_new_blogentry 
    log.save() 

だし、ここは例外です。

"django.db.models.fields.related.ForeignKey オブジェクトは0x21eef86cに割り当てられません": "Log.project" は "Project"インスタンスである必要があります。

@Theライン---> log.project = sender.project.field

project_blog_entry_signal()関数に

センダオブジェクトはしていないようプロジェクトをモデルインスタンスとして渡しますが、外部キーインスタンスとして渡します。何故ですか?

答えて

2

解決しました。 'sender'引数は単なるクラスオブジェクトであり、インスタンスではありません。私のコールバックで私のようなkwargsからして、インスタンスを参照することができます。 blog_entry_instance = kwargsから[「インスタンス」]

ので、コールバック関数は次のようになります。

@receiver(post_save, sender=BlogEntry) 
def project_blog_entry_signal(sender, **kwargs): 
    log = Log() 
    log.project = kwargs["instance"].project 
    log.content_type = Log.content_new_blogentry 
    log.save() 
+1

をちょうどあなたにいくつかのタイピングを節約するために、あなたの可能性関数のパラメータを "def project_blog_entry_signal(送信者、インスタンス、** kwargs)"として定義します。この方法では、 "kwargs [" instance "]"と入力する必要はありませんが、代わりに "instance"と入力します:) – LaundroMat

関連する問題