Pregunta

Tengo una función:

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

Que debe llamarse cuando se llama a la señal de user_activada de la registro de django.

Conecto la señal y la función usando esto:

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

Pero la función no se llama cuando un usuario hace clic en el enlace de activación, que recibió por correo electrónico.

¿Qué extraño aquí?

¿Fue útil?

Solución

Una función como esta:

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

y una llamada de conexión como esta:

user_activated.connect(create)

hace el trabajo. Los tengo en mi archivo Signals.py.

Otros consejos

Si la aplicación Django-Registration no estaba realmente instalada, sino que simplemente se copió en un proyecto, su código que escucha las señales no se llamará correctamente.

De la registro django v0.8 documentación:

Tengo funciones escuchando las señales de registro/activación, ¡pero no se les llama!

La causa más común de esto es colocar la registro de Django en un subdirectorio que está en su ruta de importación de Python, en lugar de instalarla directamente en la ruta de importación como de costumbre. La importación de la registro de Django en ese caso puede causar varios problemas, incluidos los controladores de señal de conexión incorrecta. Por ejemplo, si tuviera que colocar el registro de Django dentro de un directorio llamado Django_Apps, y consulte de esa manera, terminaría con una situación en la que su código hace esto:

from django_apps.registration.signals import user_registered

Pero el registro de Django estará haciendo:

from registration.signals import user_registered

Desde el punto de vista de Python, estas declaraciones de importación se refieren a dos objetos diferentes en dos módulos diferentes, por lo que los controladores de señal conectados a la señal de la primera importación no se llamarán cuando la señal se envíe utilizando la segunda importación.

Para evitar este problema, siga la práctica estándar de instalar el registro de django directamente en su ruta de importación y siempre refiriéndose a él por su propio nombre del módulo: registro (y en general, siempre es una buena idea seguir las prácticas normales de Python para la instalación y Uso de aplicaciones Django).

user_activated es en sí es una señal. Entonces debe enviarse a sí mismo, con parámetros. Requiere 2 argumentos aparte del remitente, es decir, usuario, solicitud

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

Foo es la clase de backend utilizada para activar al usuario.

¿El código que conecta el método de manejo de señal a esa señal definitivamente se está cargando? (Puede probar con una declaración de impresión inmediatamente después). Puede asegurarse de cargar sus manejadores de señal para una aplicación determinada importándolos desde esa aplicación __init__.py:

from nameofapp.nameoffilewithhandlersinit import *

PD. ¿Es ese un error tipográfico en el envío, o un nombre deliberado?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top