2010-08-07 36 views
2

我有一个函数:连接一个Django登记信号

def create(sender, **kw): 
    [...] 

当从django的登记的user_activated信号称为哪些应该被调用。

我连接信号并使用此功能:

from registration.signals import user_activated 
[...] 
post_save.connect(create, sender=user_activated, dispatch_uid="users-atactivation-signal") 

但是,当用户点击激活链接,这是他得到了通过电子邮件上未调用的函数。

我在这里错过了什么。

回答

2

这样的功能:

def create(sender, user, request, **kwarg): 
[...] 

和这样的连接调用:

user_activated.connect(create) 

做这项工作。我有这些在我的signals.py文件。

+0

这是正确的解决方案吗? – James 2012-05-10 11:17:12

+0

我试图在这里实现同样的事情,但我无法得到它的工作,我的代码在这里。请检查出来http://stackoverflow.com/questions/3430937/connecting-a-django-registration-signal – picomon 2014-06-11 19:04:32

0

user_activated本身就是一个信号。所以你必须自己发送参数。它需要2个参数除了发送者,即用户,请求

user_activated.send(sender=Foo, user=request.user, request=request) 

Foo是用于激活用户后端类。

+0

叫我笨,但我不明白。我以为我必须将信号连接到一个函数来调用。如果我按照你所说的做,Foo将会是“user_activated”,对吧?但是,我在哪里可以调用该函数? 我可能对信号工作有很大的误解,也许你可以帮助我? – Kai 2010-08-14 09:47:21

0

将信号处理方法连接到该信号的代码是否正确加载? (您可以在打印后立即进行测试)。您可以确保您通过从应用程序的__init__.py导入它们加载你的信号处理程序给定的应用程序:

from nameofapp.nameoffilewithhandlersinit import *

PS。 dispatch_uid中是一个错字,还是故意的名字?

2

如果Django的注册应用程序实际上并没有安装,而只是复制到该监听信号的项目代码将无法得到正确调用。

从Django的注册V0.8 documentation

我有功能监听注册/激活信号, 但他们没有得到所谓的!

这最常见的原因是将django注册放置在您的Python导入路径中的 子目录中,而不是 将它直接安装到导入路径上。从 导入django注册在这种情况下可能会导致各种问题,包括 错误地连接信号处理程序。

from django_apps.registration.signals import user_registered

:例如,如果你要 地方的Django注册了一个名为django_apps里面, 是指它以这种方式,你会在哪里 你的代码做这结束了一个情况不过在Django登记会做:

from registration.signals import user_registered

从Python的角度来看 ,这些import语句指的是两个不同的对象有两种 不同的模块,所以信号处理程序连接到来自 的信号,当第二次导入使用 发送信号时,不会调用第一个导入。

为了避免这个问题,请直接在导入路径上安装 Django的登记总是被自己的模块名称引用 它的标准做法:注册(在一般情况下,它是 总是一个好主意遵循正常的Python实践来安装 并使用Django应用程序)。