web-dev-qa-db-fra.com

django - les signaux ne fonctionnent pas

J'essaie de créer des flux d'activité d'utilisateurs à partir de leur statut.

des modèles:

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)

Cependant, bien que je crée un nouveau statut, cela ne crée pas une nouvelle activité à partir du signal post_save

signaux:

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)

Qu'est-ce que je fais mal? S'il vous plaît aidez-moi à résoudre ce problème. Je vous en serai très reconnaissant. Je vous remercie.

Mettre à jour:

Cependant, cela crée l'activité suivante:

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

Pourquoi ce qui précède ne fonctionne-t-il pas alors?

28
Kakar

On dirait que votre post_save.connect n'est pas exécuté. Vous devriez importer signals quelque part. Pour Django 1.7, il est recommandé de le faire dans la fonction config ready () de l'application. Lisez le "Où ce code devrait-il vivre?" note latérale dans la documentation.

Par exemple, si votre application s'appelle activity:

activité/__ init__.py

default_app_config = 'activity.apps.ActivityAppConfig'

activité/apps.py

from Django.apps import AppConfig

class ActivityAppConfig(AppConfig):
    name = 'activity'

    def ready(self):
        import activity.signals

Et n'oubliez pas d'ajouter dispatch_uid à votre appel connect():

post_save.connect(create_activity_item, sender=Status,
                  dispatch_uid="create_activity_item")

UPDATE: name L'attribut de ContentType est toujours en minuscule. Donc, vous devriez changer l'instruction if en:

if ctype.name == 'status':
68
catavaran

Sans toucher apps.py cela a fonctionné pour moi.

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:
        # post save actions if new instance is created,
        # do something with `instance` or another models
        # be careful about circular imports. \m/

et les signaux accrochent,

post_save.connect(post_save_user_actions, sender=MyModel)
1
All Іѕ Vаиітy