In Django, how do I know the currently logged-in user? In Django, how do I know the currently logged-in user? django django

In Django, how do I know the currently logged-in user?


Where do you need to know the user?

In views the user is provided in the request as request.user.

For user-handling in templates see here

If you want to save the creator or editor of a model's instance you can do something like:

model.py

class Article(models.Model):    created_by = models.ForeignKey(User, related_name='created_by')    created_on = models.DateTimeField(auto_now_add = True)    edited_by  = models.ForeignKey(User, related_name='edited_by')    edited_on  = models.DateTimeField(auto_now = True)    published  = models.BooleanField(default=None)

admin.py

class ArticleAdmin(admin.ModelAdmin):    fields= ('title','slug','text','category','published')    inlines = [ImagesInline]    def save_model(self, request, obj, form, change):         instance = form.save(commit=False)        if not hasattr(instance,'created_by'):            instance.created_by = request.user        instance.edited_by = request.user        instance.save()        form.save_m2m()        return instance    def save_formset(self, request, form, formset, change):         def set_user(instance):            if not instance.created_by:                instance.created_by = request.user            instance.edited_by = request.user            instance.save()        if formset.model == Article:            instances = formset.save(commit=False)            map(set_user, instances)            formset.save_m2m()            return instances        else:            return formset.save()

I found this on the Internet, but I don't know where anymore


Extending @vikingosegundo's answer, if you want to get the username inside Models, I found a way that involves declaring a MiddleWare. Create a file called get_username.py inside your app, with this content:

from threading import current_thread_requests = {}def get_username():    t = current_thread()    if t not in _requests:         return None    return _requests[t]class RequestMiddleware(object):    def process_request(self, request):        _requests[current_thread()] = request

Edit your settings.py and add it to the MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (    ...    'yourapp.get_username.RequestMiddleware',)

Now, in your save() method, you can get the current username like this:

from get_username import get_username...def save(self, *args, **kwargs):    req = get_username()    print "Your username is: %s" % (req.user)


Django 1.9.6 default project has user in the default templates

So you can write things like this directly:

{% if user.is_authenticated %}    {{ user.username }}{% else %}    Not logged in.{% endif %}

This functionality is provided by thedjango.contrib.auth.context_processors.auth context processor in settings.py.

Dedicated template question: How to access the user profile in a Django template?