2015-01-25 22 views
19

Sto provando a creare flussi di attività degli utenti dal loro stato.django - segnali non funzionanti

modelli:

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) 

Tuttavia, anche se creo un nuovo status, ma non crea una nuova attività dal segnale post_save.

segnali:

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) 

Che cosa sto facendo di sbagliato? Per favore aiutami a risolvere questo problema. Sarò molto grato. Grazie.

Aggiornamento:

Tuttavia facendo in questo modo crea l'attività:

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

Perché non lo fa le opere di cui sopra, allora?

risposta

48

Sembra che il tuo post_save.connect non sia stato eseguito. Dovresti importare signals da qualche parte. Per django 1.7 si consiglia di farlo nella funzione config ready() dell'applicazione. Leggi la nota a margine "Where should this code live?" nei documenti.

Per esempio, se la vostra applicazione si chiama activity:

attività/__ init__.py

default_app_config = 'activity.apps.AcctivityAppConfig' 

attività/apps.py

from django.apps import AppConfig 

class ActivityAppConfig(AppConfig): 
    name = 'activity' 

    def ready(self): 
     import activity.signals 

e non dimenticare per aggiungere dispatch_uid alla chiamata connect():

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

UPDATE: name attributo ContentType è sempre in minuscolo. Così si dovrebbe modificare l'istruzione if a:

if ctype.name == 'status': 
+1

ciao. Ho fatto come hai fatto nella risposta. Ma non sta ancora creando alcuna attività. Nel file '__init __. Py' ho aggiunto' default_app_config = 'activities.apps.ActivityAppConfig'' come attività è il nome dell'app. E poi ha aggiunto un nuovo file apps.py nell'app mentre cambiava il campo del nome di "ActivityAppConfig" in "attività". E poi aggiungi 'dispatch_uid'. – Kakar

+0

Vedere la risposta aggiornata. – catavaran

+0

Sì! Ora sta funzionando. Un'altra cosa. Devo sempre importare i segnali creando apps.py? Perché non funziona senza di esso? – Kakar

1

Senza toccare apps.py questo ha funzionato per me.

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/ 

e il gancio segnali,

post_save.connect(post_save_user_actions, sender=MyModel)