2013-11-28 14 views
7

blogの助けを借りてユーザーのフィード/アクティビティフィードを作成するプロジェクトを作成しようとしています。djangoシグナルが期待通りに機能しない

これらはモデルです -

class StreamItem(models.Model): 
    user = models.ForeignKey(User) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    pub_date = models.DateTimeField(default=datetime.now) 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    @property 
    def content_class(self): 
     return self.content_type.model 


class Blog(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=300) 
    body = models.TextField() 
    pub_date = models.DateTimeField(default=datetime.now) 


class Photo(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=200) 
    image = models.ImageField(upload_to=get_upload_file_name) 
    pub_date = models.DateTimeField(default=datetime.now) 

そして、これはsignals.pyです:

__init__.py 
from django.db.models import signals 
from django.contrib.contenttypes.models import ContentType 
from django.dispatch import dispatcher 
from blogs.models import Blog 
from picture.models import Photo 
from models import StreamItem 

def create_stream_item(sender, instance, signal, *args, **kwargs): 

    # Check to see if the object was just created for the first time 

    if 'created' in kwargs: 
     if kwargs['created']: 
      create = True 

      # Get the instance's content type 

      ctype = ContentType.object.get_for_model(instance) 

      if create: 
       si = StreamItem.objects.get_or_create(user=instance.user, content_type=ctype, object_id=instance.id, pub_date = instance.pub_date) 

# Send a signal on post_save for each of these models 

for modelname in [Blog, Photo]: 
    dispatcher.connect(create_stream_item, signal=signals.post_save, sender=modelname) 

私がブログを作成したり、写真をアップロードすると、signalは動作しません。そして、私はあまりにもエラーを取得していません。しかし、私はadminを使用してStreamItemアプリにアイテムを手動で追加することができます。また、StreamItemは機能します。私はsignals.pyに問題があると思う。私を助けてください。大いに感謝するだろう。ありがとうございました。

答えて

11

djangoの起動直後にシグナルがロードされていることを確認する必要があります。 それを確保するための一つの可能​​な方法は、答えてくれてありがとう、__init__.py

# __init__.py 
# add the below line and run the project again 
import signals 
+0

こんにちは。 signals.pyに '__init __。py'を追加しました。しかし、今でもそれは動作しません。とにかくエラーをチェックするには? – Aamu

+0

ところで、 '__init __。py'ファイルに' import signals'を置かなければなりません。あるいは '__init __。py'を' signals.py'ファイルに置きますか? – Aamu

+0

@Aamu appモジュールでは、djangoが読み込まれたときに確実に読み込まれる '__init __。py'があります。ですから、 – Surya

0

コードを省略しない限り、シグナルハンドラが作成する新しいsiアイテムには、必要なフィールドuserがありません。おそらくそれをあなたのget_or_createコールに追加する必要があります。

+0

こんにちはにモジュールをインポートすることです。そして、はい、私はユーザーを追加しませんでした。しかし、今では、追加した後でも、新しいストリームアイテムは作成されません。 – Aamu

関連する問題