我有一个功能:

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

当调用来自django registration的user_actived信号时,应调用。

我使用以下方式连接信号和功能:

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

但是,当用户单击激活链接时,该功能不会调用。

我在这里想念什么。

有帮助吗?

解决方案

这样的功能:

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

和这样的连接电话:

user_activated.connect(create)

做工作。我的信号文件中有这些文件。

其他提示

如果尚未真正安装Django-Registration应用程序,而是将其复制到一个项目中,该项目的聆听信号不会被正确调用。

从Django注册v0.8 文档:

我有功能收听注册/激活信号,但它们没有被调用!

其最常见的原因是将Django注册放置在您的Python导入路径上的子目录中,而不是将其直接安装到正常的导入路径上。在这种情况下,从Django注册中导入会导致各种问题,包括错误连接信号处理程序。例如,如果要将Django-Registration放置在名为Django_Apps的目录中,并以这种方式参考它,则最终将以您的代码执行此操作的情况:

from django_apps.registration.signals import user_registered

但是Django注册将做:

from registration.signals import user_registered

从Python的角度来看,这些导入语句是指两个不同模块中的两个不同对象,因此,当使用第二个导入发送信号时,将不会调用第一个导入的信号的信号处理程序。

为避免此问题,请遵循直接在导入路径上安装Django注册的标准练习,并始终以其自己的模块名称来指代它:注册(通常,遵循正常的Python实践以安装和安装和使用Django应用程序)。

user_activated 是一个信号。因此,您必须使用参数发送自身。除发送者,即用户,请求,它需要2个参数

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

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

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

from nameofapp.nameoffilewithhandlersinit import *

PS。是dispatch_uid中的错别字还是故意的名称?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top