Проблема встроенных сигналов Django: ошибка при использовании post_save - PullRequest
1 голос
/ 13 июля 2010

Я создаю приложение, которое уведомляет пользователя о появлении новых ThreadedComments .Для этого я использую сигнал post_save.Вот мой models.py:

from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from datetime import datetime

from threadedcomments.models import ThreadedComment
from django.db.models.signals import post_save

from blog.models import Post
from topics.models import Topic

class BuzzEvent(models.Model):
    user = models.ForeignKey(User)
    time = models.DateTimeField(default=datetime.now)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

    def __unicode__(self):
        return self.content_object

def buzz_on_comment(sender, **kwargs):
    # This is called when there is a new ThreadedComment
    comment = kwargs['instance']

    user_attr_names = {
                  'post'    : 'author',
                  'topic'   : 'creator',
                  'tribe'   : 'creator',
                 }

    user = getattr(comment.content_object, 
                   user_attr_names[comment.content_type.model])

    BuzzEvent.objects.create(content_object=sender,
                             user=user,
                             time=datetime.now())

post_save.connect(buzz_on_comment, sender=ThreadedComment)

Проблема в том, что при создании нового ThreadedComment я получаю сообщение об ошибке: unbound method _get_pk_val() must be called with ThreadedComment instance as first argument (got nothing instead).Traceback и отладчик сообщают, что это происходит при создании вызовов объекта BuzzEvent signals.pre_init.send.Я не могу взломать код Django прямо сейчас, есть ли очевидное решение или идея?

1 Ответ

1 голос
/ 13 июля 2010

Похоже, это должен быть экземпляр модели (который равен comment) вместо класса модели (который равен sender) в качестве аргумента content_object:

BuzzEvent.objects.create(content_object=comment,
                         user=user)
...