django如何在更新用户时发送post_save信号?

时间:2012-05-24 13:47:32

标签: django django-signals

阅读了文档,

  

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注册框架)然而,没有发送任何东西(好吧,接收方法我什么也没做)。我还将“sender = User”参数移除到@receiver注释 - 离开

@receiver(post_save)

但这无济于事。没有任何内容输出到控制台,没有保存新数据...当用户保存时,我是否需要发送来自用户的信号?如果是这样,我该怎么做?我正在使用django-registration,所以我定义了一个UserProfile ......我的意思是,在哪里(用什么文件/方法)我会告诉用户发送信号?

3 个答案:

答案 0 :(得分:9)

您应该在某处导入signals.py来运行它。例如,在models.py

答案 1 :(得分:6)

首先,他们被称为“装饰者”。 Django中的注释是其他内容,所以最好不要混淆那里的术语。

每次保存后都会调用post_save信号,顾名思义。指定sender会将接收器限制为仅发送post_save个特定模型的保存信号。如果你把它放在外面,当任何模型被保存时,你的接收器就会被调用,这肯定不是你想要的。

这里的问题是,您的接收器,无论出于何种目的,都不存在。 Django不会导入自动导入signals.py,所以它从未见过。让它看到的唯一方法是将它导入Django看到的地方,例如models.py(如@DrTyrsa)所暗示的那样。

但是,如果你这样做,你将最终导致循环导入错误,因为你已经将models.py导入signals.py。因此,您可以直接将信号代码放入models.py中,或者在其他地方找到它来导入它; __init__.py可能会有效,但我通常只是将信号放在models.py中并将其称为一天。

答案 2 :(得分:0)

或者您可以使用此:

from django.db.models.signals import post_save