2015-01-25 18 views
19

Kullanıcıların etkinlik akışlarını kendi durumlarından oluşturmaya çalışıyorum.django - sinyaller çalışmıyor

modelleri: Yeni bir statü oluşturmak rağmen

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

, bu post_save sinyalden yeni bir aktivite oluşturmaz.

sinyalleri: Yanlış yapıyorum

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) 

? Lütfen bu problemi çözmeme yardım edin. Çok minnettar olacağım. Teşekkür ederim.

Güncelleme:

Ancak böyle yaparak aktiviteyi oluşturur:

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

neden görünmüyor sonra yukarıdaki işler?

cevap

48

post_save.connect numaralı dosyanızın yürütülmesi gibi görünmemektedir. signals'u bir yere içe aktarmalısınız. Django 1.7 için, uygulamanın config hazır() işlevinde bunu yapmanız önerilir. Dokümanlardaki "Where should this code live?" kenar notunu okuyun. Örneğin

uygulama activity çağrılıp çağrılmadığını:

etkinlik/__ init__.py

default_app_config = 'activity.apps.AcctivityAppConfig' 

etkinlik/apps.py unutma

from django.apps import AppConfig 

class ActivityAppConfig(AppConfig): 
    name = 'activity' 

    def ready(self): 
     import activity.signals 

Ve dispatch_uid'u connect() numaranıza eklemek için:

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

GÜNCELLEME: ContentType ait name nitelik küçük harflerle zaman. Bu benim için çalıştı apps.py dokunmadan

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

Merhaba. Cevabında yaptığın gibi yaptım. Ancak hala herhangi bir etkinlik oluşturmuyor. __init __. Py' içinde default_app_config = 'activity.apps.ActivityAppConfig' 'ifadesini ekledik. Ardından, "ActivityAppConfig" ad alanını "aktiviteler" olarak değiştirirken uygulamada yeni bir apps.py dosyası ekledik. Ve sonra 'dispatch_uid' ekleyin. – Kakar

+0

Güncellenen cevaba bakınız. – catavaran

+0

Evet! Şimdi çalışıyor. Bir şey daha. Her zaman apps.py oluşturarak sinyal almak zorunda mıyım? Neden onsuz çalışmıyor? – Kakar

1

: Yani if deyimi olarak değişmelidir.

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/ 

ve sinyalleri kanca

,

post_save.connect(post_save_user_actions, sender=MyModel) 
İlgili konular