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?