在 Django 中,如何知道当前登录的用户?

在 Django 中,如何知道当前登录的用户?

75981 次浏览

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?

You just need to request current user:

 def foo():
current_user = request.user
return print(current_user)
foo()