如何在Django中获取当前登录用户的ID?

183
如何获取当前登录用户的ID?
在`models.py`中:
class Game(models.model):
    name = models.CharField(max_length=255)
    owner = models.ForeignKey(User, related_name='game_user', verbose_name='Owner')

views.py文件中:
gta = Game.objects.create(name="gta", owner=?)

2
可能是重复的问题:在Django中,如何知道当前登录的用户? - Ciro Santilli OurBigBook.com
8个回答

313

首先确保你已经在MIDDLEWARE_CLASSES中添加了SessionMiddlewareAuthenticationMiddleware中间件。

当前的userrequest对象中,你可以通过以下方式获取它:

def sample_view(request):
    current_user = request.user
    print current_user.id

request.user将给你一个代表当前登录用户的User对象。如果没有用户当前登录,request.user将被设置为AnonymousUser的实例。你可以通过字段is_authenticated来区分它们,像这样:

if request.user.is_authenticated:
    # Do something for authenticated users.
else:
    # Do something for anonymous users.

参考:https://docs.djangoproject.com/en/1.7/topics/auth/default/#authentication-in-web-requests - aliteralmind
4
如果我们想将外键userid设置为当前登录用户的id所在的模型,该怎么办? - Krishnadas PC
您不再需要更新设置。https://docs.djangoproject.com/en/1.11/topics/auth/default/#authentication-in-web-requests - rogerodipo
3
请求来自哪里? - Soren
链接到User模型的参考文档。 - x-yuri
请注意,Django 1.10+使用布尔值user.is_authenticated代替**user.is_authenticated()**。 - Samuel Dauzon

30

您可以使用以下代码访问当前已登录的用户:

request.user.id

8
假设您指的是Django的Auth User,在您的视图中:
def game(request):
  user = request.user

  gta = Game.objects.create(name="gta", owner=user)

2

从模板内部获取

这是我通常在模板中获取当前登录用户及其ID的方法。

<p>Your Username is : {{user}} </p>
<p>Your User Id is  : {{user.id}} </p>

0

只需进入您的profile.html模板并添加一个名为“段落”的HTML标签即可。

<p>User-ID: {% user.id %}</p>

0

这是我通常在模板中获取当前登录用户及其ID的方法。

<p>Your Username is : {{user|default: Unknown}} </p>
<p>Your User Id is  : {{user.id|default: Unknown}} </p>

0

我在一个ajax视图中编写了这个,但它是一个更广泛的答案,提供当前已登录和已注销用户列表。

is_authenticated属性总是为我的用户返回True,我想这是预期的,因为它只检查AnonymousUsers,但如果你要开发一个需要显示已登录用户的聊天应用程序,那么它就毫无用处了。

这将检查过期的会话,然后根据解码的_auth_user_id属性确定它们属于哪个用户:

def ajax_find_logged_in_users(request, client_url):
    """
    Figure out which users are authenticated in the system or not.
    Is a logical way to check if a user has an expired session (i.e. they are not logged in)
    :param request:
    :param client_url:
    :return:
    """
    # query non-expired sessions
    sessions = Session.objects.filter(expire_date__gte=timezone.now())
    user_id_list = []
    # build list of user ids from query
    for session in sessions:
        data = session.get_decoded()
        # if the user is authenticated
        if data.get('_auth_user_id'):
            user_id_list.append(data.get('_auth_user_id'))

    # gather the logged in people from the list of pks
    logged_in_users = CustomUser.objects.filter(id__in=user_id_list)
    list_of_logged_in_users = [{user.id: user.get_name()} for user in logged_in_users]

    # Query all logged in staff users based on id list
    all_staff_users = CustomUser.objects.filter(is_resident=False, is_active=True, is_superuser=False)
    logged_out_users = list()
    # for some reason exclude() would not work correctly, so I did this the long way.
    for user in all_staff_users:
        if user not in logged_in_users:
            logged_out_users.append(user)
    list_of_logged_out_users = [{user.id: user.get_name()} for user in logged_out_users]

    # return the ajax response
    data = {
        'logged_in_users': list_of_logged_in_users,
        'logged_out_users': list_of_logged_out_users,
    }
    print(data)

    return HttpResponse(json.dumps(data))


0
您可以在Django视图中使用HttpRequest.userget_user(request)来获取已登录用户的ID,如下所示:
# "views.py"

from django.shortcuts import render
from django.contrib.auth import get_user # Here

def test(request):
    print(request.user.id) # 32
    print(get_user(request).id) # 32
    return render(request, 'index.html')

在Django模板中,您可以像下面这样获取已登录用户的ID:
{% "index.html" %}

{{ user.id }} {% 32 %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接