Get current user log in signal in Django
If you are using the admin site why not use a custom model admin
class MyModelAdmin( admin.ModelAdmin ):
def save_model( self, request, obj, form, change ):
#pre save stuff here
obj.save()
#post save stuff here
admin.site.register( MyModel, MyModelAdmin )
A signal is something that is fired every time the object is saved regardless of if it is being done by the admin or some process that isn't tied to a request and isn't really an appropriate place to be doing request based actions
Being reluctant to mess around with thread-local state, I decided to try a different approach. As far as I can tell, the post_save
and pre_save
signal handlers are called synchronously in the thread that calls save()
. If we are in the normal request handling loop, then we can just walk up the stack to find the request object as a local variable somewhere. e.g.
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save)
def my_callback(sender, **kwargs):
import inspect
for frame_record in inspect.stack():
if frame_record[3]=='get_response':
request = frame_record[0].f_locals['request']
break
else:
request = None
...
If there's a current request, you can grab the user
attribute from it.
Note: like it says in the inspect
module docs,
This function relies on Python stack frame support in the interpreter, which isn’t guaranteed to exist in all implementations of Python.