2010-08-19 16 views
6

Estoy trabajando en un proyecto django, donde quiero implementar una señal a la que se debe llamar cuando se cambia alguna dirección de usuario. He visto las señales incorporadas, pero no parecen funcionar en mi caso, porque si uso guardar, también se llamará en otros eventos de guardar y aunque puedo crear una señal personalizada, no pude averiguar ¿Cómo debería llamar esto?Creando una señal django para actualización de detalles de usuario

Sugerido.

Gracias de antemano.

Respuesta

16

Comience definiendo una señal personalizada. Una señal personalizada aquí es una subclase de django.dispatch.Signal. Este código puede vivir en app/signals.py.

from django.dispatch import Signal 
user_address_changed = Signal(providing_args=["user"]) 

A continuación, asegúrese de enviar esta señal cuando se modifique la dirección de su usuario. Dependiendo de cómo haya definido User y Address, esto se puede hacer en diferentes lugares. Supongamos que hay una vista que permite a los usuarios actualizar sus modelos Address. Este código se presume en app/views.py.

from app import signals 

def update_address(request, *args, **kwargs): 
    # all the changes go well. 
    signals.user_address_changed.send(sender=None, user=request.user) 
    # Render to template etc. 

Ahora necesita configurar un receptor para esta señal.

from app.signals import user_address_changed 

def handle_user_address_change(sender, **kwargs): 
    """Trap the signal and do whatever is needed""" 
    user = kwargs['user'] 
    # Write to log, update db, send mail etc. 

user_address_changed.connect(handle_user_address_change) 

actualización

(Después de leer comentarios; el OP explica que no existe un criterio independiente que actualizaciones de dirección) En ese caso se puede tratar de anular User.save() para enviar esta señal. Digo "intentar" porque no sé si está utilizando su propia clase User o auth.User.

+0

gracias por su respuesta Manoj, éste podría funcionar bien para las actualizaciones de usuario front-end. Pero si cambiamos la dirección a través del panel de administración, no se llamaría a esta vista y, por lo tanto, esta señal no se enviaría. –

+0

Respuesta actualizada. Véase más arriba. –

+0

es un modelo separado con el usuario como una clave externa ... así que supongo que User.save() no es posible en este caso? –

1

Es posible apreciar django-signalqueue:

https://github.com/fish2000/django-signalqueue

Es una extensión de la operadora de la señal que proporciona una clase AsyncSignal. Las devoluciones de llamada de AsyncSignal se pueden ejecutar en un hilo de trabajo separado: puede controlar el comportamiento específico de los oyentes asincrónicos que defina.

(información completa:. La escribí)

Cuestiones relacionadas