0

我知道这已经被问过并回答过,但没有一个建议的解决方案对我有用。这是我的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函数中的代码从未到达,就像接收器工作不正常或收听错误的信号一样。任何人?

4

3 回答 3

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>')
于 2013-09-20T08:59:54.740 回答
2

我终于找到了解决办法!!!我注意到handlers.py没有 generate handlers.pyc,这对我来说看起来很奇怪。所以我所做的就是handlers.py在我的文件中导入__init__.py以告诉 django 这个文件存在并且它工作得很好。我不太明白为什么。我相信这可能是因为我的代码中的任何地方都没有直接引用该文件,只是将其设置为信号的接收者,但从未明确调用过。

于 2013-09-20T15:42:02.140 回答
0

您的代码可能不会生成 .pyc,因为您有语法错误:

    print 'I'm doing nothing!!!'

如果要在字符串中使用单引号,则需要用双引号标记字符串,或使用转义序列。

于 2016-05-12T21:22:15.693 回答