The current user in the pre_delete signal in django

Is it possible to get a signed django user (who calls the model removal method) in a callback connected to the pre_delete signal?

+4
source share
1 answer

The pre_delete signal pre_delete not transmit an instance of the request, but you can add a decorator that adds it and use this decorator in a view that deletes the specified model.

Assuming this is a callback function:

 def pre_delete_cb(sender, instance, using, **kwargs): pass 

which is added to the decorator:

 from django.db.models.signals import pre_delete from functools import wraps from django.utils.decorators import available_attrs def pre_delete_dec(cb, sender): def decorator(view_func): @wraps(view_func, assigned=available_attrs(view_func)) def _wrapped_view(request, *args, **kwargs): cb.request = request # here we add the request to the callback function pre_delete.connect(cb, sender=sender) # and connecting the real pre_delete to the callback return view_func(request, *args, **kwargs) return _wrapped_view return decorator 

And use the decorator on the view as you call it, instead of pre_delete.connect(pre_delete_cb, MyModel) use:

 @pre_delete_dec(pre_delete_cb, MyModel) def myview(request): 

and then in the callback you will get access to the request as:

 def pre_delete_cb(sender, instance, using, **kwargs): current_user = pre_delete_cb.request.user 

You can add this globally, not just for viewing - using Middleware:

 from django.db.models.signals import pre_delete def pre_delete_cb(sender, instance, using, **kwargs): current_user = pre_delete_cb.request.user class PreDeleteMiddleware(object): def process_view(self, request, view_func, view_args, view_kwargs): pre_delete_cb.request = request from myapp.models import MyModel pre_delete.connect(pre_delete_cb, sender=MyModel) 
+5
source

All Articles