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

bha*_*ral 4 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()
Run Code Online (Sandbox Code Playgroud)

从我读到的,我认为我需要做的就是发送信息.好吧,那并创建一个新用户(我使用django注册框架)然而,没有发送任何东西(好吧,我没有做任何接收器方法).我还删除了@receiver注释的"sender = User"参数 - 离开

@receiver(post_save)
Run Code Online (Sandbox Code Playgroud)

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

DrT*_*rsa 9

你应该导入你的signals.py某个地方来运行它.例如在models.py.

  • @bharal只需导入.你需要以某种方式运行它.并在`signals.py`中使用`django.db.models.get_model`来阻止循环导入. (4认同)

Chr*_*att 6

首先,他们被称为"装饰者".Django中的注释是其他的东西,所以最好不要混淆那里的术语.

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

在这里你的问题是,你的接收器,对所有意图和目的不存在.Django不会自动导入导入signals.py,因此从未见过.让它看到的唯一方法是将它导入Django确实看到的地方,例如models.py(如@DrTyrsa)所暗示的那样.

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