Question

Hey, Im trying to get the signal pre_save to work on my model but there seems to be some problem with a foreign key or something. My model is like this:

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)

And here is where the form is processed and saved:

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

And here's my signal reciever function

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

And here's the exception:

Cannot assign "django.db.models.fields.related.ForeignKey object at 0x21eef86c": "Log.project" must be a "Project" instance.

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

project_blog_entry_signal() function

The sender object doesn't seem to pass the project as a model instance but rather as a Foreign key instance. Why is that?

Was it helpful?

Solution

Solved it. The 'sender' argument is just a class object, not an instance. In my callback I can reference the instance by the kwargs like: blog_entry_instance = kwargs["instance"]

So the callback function would look like this:

@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()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top