连接django-registration信号

时间:2010-08-07 15:24:27

标签: django django-registration

我有一个功能:

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

当调用来自django-registration的user_activated信号时应调用哪个。

我用这个连接信号和功能:

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

但是当用户点击他通过电子邮件获得的激活链接时,不会调用该函数。

我在这里想念什么。

4 个答案:

答案 0 :(得分:3)

这样的功能:

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

和这样的连接调用:

user_activated.connect(create)

完成这项工作。我在signals.py文件中有这些。

答案 1 :(得分:2)

如果django-registration app实际上没有安装,而只是复制到项目中,那么监听信号的代码将无法正确调用。

来自django-registration v0.8 documentation

  

我有功能监听注册/激活信号,   但他们没有被召唤!

     

最常见的原因是将django-registration放入a   在Python导入路径上的子目录,而不是   像往常一样直接将它安装到导入路径上。从中导入   在这种情况下,django-registration会导致各种问题,包括   错误连接信号处理程序。例如,如果你是   将django-registration放在名为django_apps的目录中,和   以这种方式提到它,你最终会遇到这种情况   你的代码执行此操作:

     

from django_apps.registration.signals import user_registered

     

但是django-registration将会这样做:

     

from registration.signals import user_registered

     

从Python的角度来看   在这种情况下,这些import语句引用了两个不同的对象   不同的模块,所以信号处理器连接到信号   使用时发送信号时不会调用第一次导入   第二次进口。

     

要避免此问题,请遵循安装的标准做法   django-直接在您的导入路径上注册并始终引用   通过它自己的模块名称:注册(通常,它是   总是一个好主意遵循正常的Python实践来安装   并使用Django应用程序)。

答案 2 :(得分:0)

user_activated本身就是一个信号。所以你必须用参数发送自己。它需要除发件人之外的两个参数,即用户,请求

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

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

答案 3 :(得分:0)

将信号处理方法连接到该信号的代码是否已加载? (您可以在其后立即测试打印声明)。您可以通过从该应用的__init__.py导入应用,确保为指定应用加载信号处理程序:

from nameofapp.nameoffilewithhandlersinit import *

PS。这是dispatch_uid中的拼写错误,还是故意的名字?