Django:模型上缺少信号回调函数

Django:模型上缺少信号回调函数,django,callback,django-signals,Django,Callback,Django Signals,哎,, 我正试着让信号pre_save在我的模型上工作,但是没有 外键好像有问题。我的模型是 像这样: class BlogEntry(models.Model): headline = models.CharField(max_length=100) content = models.CharField(max_length=2000) written_by = models.ForeignKey(User) date = models.DateTimeFiel

哎,, 我正试着让信号pre_save在我的模型上工作,但是没有 外键好像有问题。我的模型是 像这样:

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)
@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()
这里是处理和保存表单的位置:

    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” 必须是“项目”实例

@行-->log.project= 中的sender.project.field

project\u blog\u entry\u signal()函数


发送方对象似乎不是作为模型实例传递项目,而是作为外键实例传递。为什么呢

解决了它。“sender”参数只是一个类对象,而不是实例。在我的回调中,我可以通过kwargs引用实例,如: blog\u entry\u instance=kwargs[“instance”]

因此回调函数如下所示:

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)
@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()

为了节省一些输入,您可以将函数参数定义为“def project\u blog\u entry\u signal(sender,instance,**kwargs)”。这样,您就不需要键入“kwargs[“instance”]”,而是键入“instance:)