2012-05-24 61 views
4

有閱讀文檔,django如何在更新用戶時發送post_save信號?

https://docs.djangoproject.com/en/dev/topics/signals/

我在signals.py文件創建這樣的:

from django.db.models.signals import post_save 
from django.dispatch import receiver 
from models import User 

from models import Story 

@receiver(post_save, sender=User) 
def create_initial_story(sender,instance, signal, created, **kwargs): 
    print "helloooo!" 
    if created: 
     Story(user = instance, title = 'Random Stories', description="Random stories", is_closed = False, is_random = True).save() 

其中,從我讀,是所有我想我需要做的發送消息。那麼,並創建一個新的用戶(我使用Django的註冊框架)然而,沒有任何東西正在發送(好吧,接收方法我什麼也沒做)。我還刪除了「發件人=用戶」參數@receiver註釋 - 留下

@receiver(post_save) 

但這並沒有幫助的事情。什麼都不輸出到控制檯,沒有新的數據保存...我需要發送用戶保存時的信號?如果是這樣,我該怎麼做?我使用django註冊,所以我有一個UserProfile定義...我的意思是,在哪裏(在什麼文件/方法)我會告訴用戶發送信號?

回答

9

你應該在某處導入你的signals.py來運行它。例如在models.py

+0

hm,我對python有點新東西 - 所以除了導入信號線之外,我是否需要在models.py中調用它呢?或者我可以把它導入並保留在那裏? – bharal

+4

@bharal只需導入。你需要以某種方式運行它。在signals.py中使用'django.db.models.get_model'來防止循環導入。 – DrTyrsa

5

首先,他們被稱爲「裝飾者」。註釋是Django中的其他內容,所以最好不要混淆術語。

post_save信號在每次保存後都會調用,正如其名稱所示。指定sender將接收器限制爲只爲post_save發送信號以保存該特定型號。如果將其保留,您的接收器將在任何型號被保存時被調用,這肯定不是您想要的。

這裏你的問題是,你的接收器,所有的意圖和目的不存在存在。 Django不導入自動導入signals.py,所以它從來沒有見過。唯一可以看到的方式是將它導入Django所看到的某處,例如models.py(如@DrTyrsa)所示。

但是,如果你這樣做了,那麼最終會導致循環導入錯誤,因爲你已經將models.py導入到signals.py中。所以,你可以直接將你的信號代碼放到models.py中,或者找到別的地方來導入它; __init__.py可能工作,但我通常只是總是把我的信號放在models.py中並稱之爲一天。

+1

或使用'django.db.models.get_model'。 :-) – DrTyrsa