阅读了文档,
我在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 ......我的意思是,在哪里(用什么文件/方法)我会告诉用户发送信号?
答案 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