连接django-registration信号

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个回答

5

像这样的一个函数:

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

并且像这样发起连接请求:

user_activated.connect(create)

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


我也在尝试实现同样的功能,但是我的代码无法正常工作,代码在这里。请查看https://dev59.com/zk_Ta4cB1Zd3GeqPCZ1A - picomon
此外,"@receiver" 装饰器看起来可以作为 connect() 的替代品。更多信息请参见 https://docs.djangoproject.com/en/dev/topics/signals/#django.dispatch.receiver - Alexandr S.

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的角度来看,这些导入语句指的是两个不同模块中的两个不同对象,因此连接到第一个导入的信号的信号处理程序在使用第二个导入发送信号时将不会被调用。为避免这个问题,请按照标准做法将django-registration直接安装在您的导入路径上,并始终通过其自己的模块名称registration引用它(通常,遵循正常的Python实践安装和使用Django应用程序总是一个好主意)。

0

user_activated本身就是一个信号。因此,您必须发送它本身和参数。除了发送者之外,它需要2个参数,即用户和请求。

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

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


称呼我愚蠢,但我不明白。我以为我必须将信号与函数连接才能调用。如果我按照你说的做,Foo 就是“user_activated”,对吗?但是那么我在哪里放置要调用的函数呢? 我可能对信号的工作有一个大误解,也许你可以帮助我理清思路? - Kai

0

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

from nameofapp.nameoffilewithhandlersinit import *

附注:dispatch_uid中是否有错别字,还是故意这样命名的?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接