Jak uzyskać identyfikator aktualnie zalogowanego użytkownika w Django?

124

Jak uzyskać identyfikator aktualnie zalogowanego użytkownika?

w models.py:

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

w views.py:

gta = Game.objects.create(name="gta", owner=?)
k44
źródło
1
Możliwy duplikat W Django, skąd mam wiedzieć, aktualnie zalogowanego użytkownika?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Exact Duplicate
Tessaracter

Odpowiedzi:

209

Po pierwsze upewnij się, że SessionMiddlewarei AuthenticationMiddlewaremiddleware dodany do MIDDLEWARE_CLASSESustawienia.

Prąd userjest w requestobiekcie, możesz go uzyskać przez:

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

request.userda ci Userobiekt reprezentujący aktualnie zalogowanego użytkownika. Jeśli użytkownik nie jest aktualnie zalogowany, request.userzostanie ustawiony na instancję AnonymousUser. Możesz je odróżnić za pomocą pola is_authenticated, na przykład:

if request.user.is_authenticated:
    # Do something for authenticated users.
else:
    # Do something for anonymous users.
KZ
źródło
3
Co jeśli chcemy ustawić identyfikator użytkownika klucza obcego na model, który jest aktualnie zalogowanym identyfikatorem użytkownika?
Krishnadas PC
Nie musisz już aktualizować ustawień. docs.djangoproject.com/en/1.11/topics/auth/default/…
wooden_metal
2
Skąd pochodzi prośba?
Sören
Link do odniesienia do Usermodelu .
x-yuri
22

Dostęp do aktualnie zalogowanego użytkownika można uzyskać za pomocą następującego kodu:

request.user.id
sriram veeraghanta
źródło
7

Zakładając, że odnosisz się do użytkownika uwierzytelniającego Django , Twoim zdaniem:

def game(request):
  user = request.user

  gta = Game.objects.create(name="gta", owner=user)
Neil
źródło
0

Napisałem to w widoku Ajax, ale jest to bardziej rozbudowana odpowiedź, podająca listę aktualnie zalogowanych i wylogowanych użytkowników.

is_authenticatedAtrybutów zawsze zwraca Truedla moich użytkowników, co przypuszczam jest spodziewane, ponieważ sprawdza tylko AnonymousUsers, ale to okaże się bezużyteczne, jeśli było powiedzieć opracować aplikację czat gdzie trzeba zalogowanych użytkowników wyświetlana.

To sprawdza, czy sesje wygasły, a następnie określa, do którego użytkownika należą na podstawie zdekodowanego _auth_user_idatrybutu:

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))
ViaTech
źródło