我知道之前已经提出过这个问题并得到了回答,但是所提出的解决方案都没有对我有用。这是我的signals.py
:
from django.dispatch import Signal
my_signal = Signal(providing_args=['arg1', 'arg2', 'arg3'])
另一方面,我有一个名为handlers.py
的文件,如下所示:
from django.dispatch import receiver
from models import MyModels
from signals import my_signal
@receiver(my_signal, sender=MyModel)
def do_something(sender, **kwargs):
print 'I'm doing nothing!!!'
我将信号发送到另一个文件中,如下所示:
from signals import my_signal
from models import MyModel
def some_function():
my_signal.send(MyModel, arg1='a', arg2='b', arg3='c')
我不知道该怎么办。当我发送信号时django没有抱怨,但是do_something
函数中的代码从未到达,就像接收器工作不正常或者听错了那种信号。任何人吗?
答案 0 :(得分:3)
在django中定义信号时,需要注册它们。注册它的最佳位置是models.py
。要注册您的函数do_something
,请将代码移至models.py
文件的底部:
.
.
@receiver(my_signal, sender=MyModel)
def do_something(sender, **kwargs):
print 'I'm doing nothing!!!'
如果您希望将所有处理程序保存在单独的文件(handlers.py
)中,则需要将其导入models.py
文件中。将此行代码放在models.py
:
.
.
from handlers.py import do_something
注意:在其他文件中注册处理程序时,必须小心使用循环导入。这条线可能有害:
from models import MyModels
要仍然可以在handlers.py
中获取模型,您可以执行以下操作:
from django.db import get_model
my_model = get_model('<app_name>', '<model_name>')
答案 1 :(得分:2)
我终于找到了解决方案!我注意到handlers.py
没有生成handlers.pyc
,这看起来很奇怪。所以我所做的是在我的handlers.py
中导入__init__.py
告诉django这个文件存在并且它工作得很好。我不明白的是为什么。我相信这可能是因为我的代码中的任何地方都没有直接引用该文件,只是设置为信号的接收者但从未明确调用过。
答案 2 :(得分:0)
您的代码可能不会生成.pyc,因为您遇到语法错误:
print 'I'm doing nothing!!!'
如果要在字符串中包含单引号,则需要使用双引号标记字符串,或使用转义序列。