2011-07-27 14 views
5

Deseo que se notifique a los administradores cuando se eliminan ciertos objetos, pero también quiero determinar qué usuario está realizando la eliminación.Django: determine qué usuario está eliminando al usar la señal post_delete

¿Es posible?

Este es el código:

# models.py 
# signal to notify admins when nodes are deleted 
from django.db.models.signals import post_delete 
from settings import DEBUG 

def notify_on_delete(sender, instance, using, **kwargs): 
    ''' Notify admins when nodes are deleted. Only for production use ''' 
    if DEBUG: 
     #return False 
     pass 
    # prepare context 
    context = { 
     'node': instance, 
     'site': SITE 
    } 
    # notify admins that want to receive notifications 
    notify_admins(instance, 'email_notifications/node-deleted-admin_subject.txt', 'email_notifications/node-deleted-admin_body.txt', context, skip=False) 

post_delete.connect(notify_on_delete, sender=Node) 

Respuesta

5

Dudo que sea posible el uso de las señales incorporados (no hay User implícitamente ligado a una operación delete, y debido a Django de loose coupling la capa de base de datos no se ocupa con HttpRequest objetos). Me gustaría crear mi propia señal que proporciona un argumento user y enviarlo en cualquier vista de la operación de eliminación se lleva a cabo, algo así como:

# myapp/signals.py 
from django.dispatch import Signal 
my_post_delete = Signal(providing_args=['instance', 'user']) 

# myapp/models.py 
from myapp.signals import my_post_delete 
... 
my_post_delete.connect(notify_on_delete, sender=Node) 

# myapp/views.py 
from myapp.signals import my_post_delete 
... 
@login_required 
def my_delete_view(request, ...) 
    ... 
    instance = Node.objects.get(...) 
    instance.delete() 
    my_post_delete.send(sender=Node, instance=instance, user=request.user) 
+0

¿No sería mejor si la señal se disparó por el modelo en lugar de la ¿ver? Por lo tanto, la interfaz de administración y el código de terceros todavía funcionarían? –

+0

@Jack M. Supongo que sería mejor, pero ¿cómo se puede saber qué 'Usuario' está haciendo la eliminación sin una' solicitud'? –

Cuestiones relacionadas