web-dev-qa-db-ja.com

django-信号が機能しない

ユーザーのステータスからユーザーのアクティビティストリームを作成しようとしています。

モデル:

class Status(models.Model):
    body = models.TextField(max_length=200)
    image = models.ImageField(blank=True, null=True, upload_to=get_upload_file_name)
    privacy = models.CharField(max_length=1,choices=PRIVACY, default='F')
    pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)
    user = models.ForeignKey(User)

class Activity(models.Model):
    actor = models.ForeignKey(User)
    action = models.CharField(max_length=100)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)

ただし、新しいステータスを作成しても、post_saveシグナル。

信号:

from Django.contrib.contenttypes.models import ContentType
from Django.db.models.signals import post_save
from status.models import Status
from models import Activity

def create_activity_item(sender, instance, signal, *args, **kwargs):
    if kwargs.get('created', True):
        ctype = ContentType.objects.get_for_model(instance)

        if ctype.name == 'Status':
            action = ' shared '

            activity = Activity.objects.get_or_create(
                actor = instance.user,
                action = action,
                content_type = ctype,
                object_id = instance.id,
                pub_date = instance.pubdate
            )

post_save.connect(create_activity_item, sender=Status)

私は何を間違えていますか?この問題の解決を手伝ってください。とても感謝しています。ありがとうございました。

更新:

ただし、このようにするとアクティビティが作成されます。

@receiver(post_save, sender=Status)
def create(sender, instance, **kwargs):
    if kwargs.get('created',True):
        ctype = ContentType.objects.get_for_model(instance)
        activity = Activity.objects.get_or_create(
            actor = instance.user,
            action = ' shared ',
            content_type = ctype,
            object_id = instance.id,
            pub_date = instance.pub_date
        )

なぜ上記はうまくいかないのですか?

33
Kakar

_post_save.connect_が実行されていないようです。 signalsのどこかにインポートする必要があります。 Django 1.7の場合、アプリのconfig ready()関数でこれを行うことをお勧めします。ドキュメントの "Where should this code?" side noteをお読みください。

たとえば、アプリの名前がactivityの場合:

activity/__ init __。py

_default_app_config = 'activity.apps.ActivityAppConfig'
_

activity/apps.py

_from Django.apps import AppConfig

class ActivityAppConfig(AppConfig):
    name = 'activity'

    def ready(self):
        import activity.signals
_

connect()呼び出しに dispatch_uid を追加することを忘れないでください:

_post_save.connect(create_activity_item, sender=Status,
                  dispatch_uid="create_activity_item")
_

[〜#〜] update [〜#〜]nameContentType属性は常に小文字です。したがって、ifステートメントを次のように変更する必要があります。

_if ctype.name == 'status':
_
79
catavaran

触れることなくapps.pyこれは私のために働いた。

class MyModel(models.Model):
    """ MyModel fields go """
    body = models.TextField(max_length=200)
    pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)


def post_save_actions(sender, instance, created, **kwargs):
    if created:
        pass
        # post save actions if new instance is created,
        # do something with `instance` or another models
        # be careful about circular imports. \m/

信号フック

post_save.connect(post_save_user_actions, sender=MyModel)
0