【问题标题】:Django: Signal callback function missing foreign on modelDjango:模型上缺少外部信号回调函数
【发布时间】:2011-06-09 22:45:20
【问题描述】:

嘿, 我试图让信号 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)

这里是处理和保存表单的地方:

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

@the line ---> log.project = sender.project.field 在

project_blog_entry_signal() 函数

发送者对象似乎没有将项目作为模型实例传递,而是作为外键实例传递。这是为什么?

【问题讨论】:

    标签: django callback django-signals


    【解决方案1】:

    解决了。 'sender' 参数只是一个类对象,而不是一个实例。在我的回调中,我可以通过 kwargs 引用实例,例如: blog_entry_instance = kwargs["instance"]

    所以回调函数应该是这样的:

    @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_blog_entry_signal(sender, instance, **kwargs)”。这样你就不需要输入“kwargs[“instance”]”,而是输入“instance” :)
    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多