2012-05-24 33 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