Wie erhalte ich die aktuell angemeldete Benutzer-ID in Django?

124

Wie erhalte ich die aktuell angemeldete Benutzer-ID?

in models.py:

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

in views.py:

gta = Game.objects.create(name="gta", owner=?)
k44
quelle
1
Mögliches Duplikat von In Django, woher kenne ich den aktuell angemeldeten Benutzer?
Ciro Santilli 法轮功 冠状 病 六四 事件 9
1
@CiroSantilli act 改造 中心 法轮功 法轮功 事件 Genaues Duplikat
Tessaracter

Antworten:

209

Zunächst stellen Sie sicher, SessionMiddlewareund AuthenticationMiddlewareMiddleware zu Ihrer hinzugefügt MIDDLEWARE_CLASSESEinstellung.

Der Strom userist im requestObjekt, Sie können ihn erhalten durch:

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

request.userSie erhalten ein UserObjekt, das den aktuell angemeldeten Benutzer darstellt. Wenn ein Benutzer derzeit nicht angemeldet ist, request.userwird er auf eine Instanz von gesetzt AnonymousUser. Sie können sie mit dem Feld is_authenticatedwie folgt unterscheiden:

if request.user.is_authenticated:
    # Do something for authenticated users.
else:
    # Do something for anonymous users.
KZ
quelle
3
Was ist, wenn wir die Fremdschlüssel-Benutzer-ID auf ein Modell setzen möchten, das die aktuell angemeldete Benutzer-ID ist?
Krishnadas PC
Sie müssen die Einstellungen nicht mehr aktualisieren. docs.djangoproject.com/de/1.11/topics/auth/default/…
wood_metal
2
Woher kommt die Anfrage?
Sören
Link zur UserModellreferenz .
X-Yuri
22

Sie können mit dem folgenden Code auf den aktuell angemeldeten Benutzer zugreifen:

request.user.id
Sriram Veeraghanta
quelle
7

Angenommen, Sie beziehen sich aus Ihrer Sicht auf Djangos Auth-Benutzer :

def game(request):
  user = request.user

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

Ich habe dies in einer Ajax-Ansicht geschrieben, aber es ist eine ausführlichere Antwort, die die Liste der aktuell angemeldeten und abgemeldeten Benutzer enthält.

Das is_authenticatedAttribut wird immer Truefür meine Benutzer zurückgegeben, was vermutlich erwartet wird, da es nur nach anonymen Benutzern sucht. Dies erweist sich jedoch als nutzlos, wenn Sie sagen, dass Sie eine Chat-App entwickeln, in der angemeldete Benutzer angezeigt werden müssen.

Dadurch wird nach abgelaufenen Sitzungen gesucht und anhand des decodierten _auth_user_idAttributs ermittelt , zu welchem ​​Benutzer sie gehören :

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
quelle