Làm cách nào để có id người dùng hiện đang đăng nhập trong Django?


124

Làm cách nào để có id người dùng hiện đang đăng nhập?

trong models.py:

class Game(models.model):
    name = models.CharField(max_length=255)
    owner = models.ForeignKey(User, related_name='game_user', verbose_name='Owner')

trong views.py:

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


1
@CiroSantilli 改造 心 心 Duplic Bản sao chính xác
Tessaracter

Câu trả lời:


209

Trước tiên hãy đảm bảo bạn có SessionMiddlewareAuthenticationMiddlewarephần mềm trung gian được thêm vào MIDDLEWARE_CLASSEScài đặt của bạn .

Hiện tại userlà trong requestđối tượng, bạn có thể nhận được nó bằng cách:

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

request.usersẽ cung cấp cho bạn một Userđối tượng đại diện cho người dùng hiện đang đăng nhập. Nếu người dùng hiện không đăng nhập, request.usersẽ được đặt thành phiên bản của AnonymousUser. Bạn có thể phân biệt chúng với trường is_authenticated, như vậy:

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


3
Điều gì xảy ra nếu chúng ta muốn đặt userid khóa ngoại thành mô hình là id hiện đang đăng nhập của người dùng?
PC của Krishnadas

Bạn không còn cần phải cập nhật các cài đặt. docs.djangoproject.com/en/1.11/topics/auth/default/ Kẻ
Wood_metal

2
Yêu cầu đến từ đâu?
Sören

Liên kết để tham khảo Usermô hình .
x-yuri

22

Bạn có thể truy cập người dùng đã đăng nhập hiện tại bằng cách sử dụng mã sau đây:

request.user.id

7

Giả sử bạn đang đề cập đến Người dùng Auth của Django , theo quan điểm của bạn:

def game(request):
  user = request.user

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

0

Tôi đã viết điều này trong một cái nhìn ajax, nhưng đó là một câu trả lời mở rộng hơn cho danh sách người dùng hiện đang đăng nhập và đăng xuất.

Các is_authenticatedthuộc tính luôn luôn trở lại Truecho người dùng của tôi, mà tôi cho rằng dự kiến vì nó chỉ kiểm tra cho AnonymousUsers, nhưng để chứng minh vô dụng nếu bạn đã nói phát triển ứng dụng trò chuyện, nơi bạn cần phải đăng nhập người dùng hiển thị.

Điều này kiểm tra các phiên hết hạn và sau đó tìm ra người dùng thuộc về họ dựa trên _auth_user_idthuộc tính được giải mã :

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))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.