4

阅读了文档,

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-registration 框架)但是,没有发送任何内容(好吧,我拥有的接收器方法什么都不做)。我还删除了 @receiver 注释的“sender=User”参数 - 离开

@receiver(post_save)

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

4

3 回答 3

9

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

于 2012-05-24T13:54:52.087 回答
6

首先,它们被称为“装饰器”。注释在 Django 中是另外一回事,所以最好不要在那里混淆术语。

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

您的问题是您的接收器,出于所有意图和目的不存在。Django 不会signals.py为你自动导入 import,所以从来没有见过。让它看到的唯一方法是将它导入 Django 确实看到的某个地方,例如 models.py(如 @DrTyrsa 所建议的那样)。

但是,如果您这样做,最终会出现循环导入错误,因为您已经将 models.py 导入到 signals.py 中。因此,您可以将信号代码直接放入 models.py 中,也可以找其他地方导入;__init__.py可能会起作用,但我通常只是将我的信号放在 models.py 中并收工。

于 2012-05-24T14:24:56.370 回答
0

或者你可以使用这个:

from django.db.models.signals import post_save
于 2020-07-12T17:05:43.087 回答