Django: функция обратного вызова сигнала отсутствует в модели - PullRequest
1 голос
/ 16 января 2011

Эй, я пытаюсь заставить сигнал 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" должен быть экземпляром "Project".

@ строка ---> log.project = sender.project.field в

project_blog_entry_signal () функция

Похоже, что объект отправителя передает проект не как экземпляр модели, а как экземпляр внешнего ключа.Это почему?

1 Ответ

2 голосов
/ 16 января 2011

Решил это. Аргумент «отправитель» - это просто объект класса, а не экземпляр. В моем обратном вызове я могу сослаться на экземпляр с помощью 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()
...