3

我有一个功能:

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

4 回答 4

3

像这样的函数:

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

和这样的连接调用:

user_activated.connect(create)

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

于 2010-08-26T07:44:26.033 回答
2

如果实际没有安装 django-registration 应用程序,而只是将其复制到项目中,则侦听信号的代码将无法正确调用。

从 django-registration v0.8文档

我有监听注册/激活信号的函数,但它们没有被调用!

最常见的原因是将 django-registration 放在 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 语句引用了两个不同模块中的两个不同对象,因此当使用第二个 import 发送信号时,不会调用连接到第一个 import 信号的信号处理程序。

为避免此问题,请遵循直接在导入路径上安装 django-registration 并始终通过其自己的模块名称引用它的标准做法:registration(通常,遵循常规 Python 安装和使用 Django 应用程序)。

于 2011-11-25T05:28:32.857 回答
0

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

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

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

于 2010-08-07T15:41:33.990 回答
0

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

from nameofapp.nameoffilewithhandlersinit import *

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

于 2010-08-07T15:41:50.790 回答