Bagaimana cara mendapatkan id pengguna pengguna yang saat ini masuk di Django?

124

Bagaimana cara mendapatkan id pengguna yang sedang login?

di models.py:

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

di views.py:

gta = Game.objects.create(name="gta", owner=?)
k44
sumber
1
Kemungkinan duplikat dari Dalam Django, bagaimana saya mengetahui pengguna yang sedang log in?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Exact Duplicate
Tessaracter

Jawaban:

209

Pertama, pastikan Anda memiliki SessionMiddlewaredan AuthenticationMiddlewaremiddlewares ditambahkan ke MIDDLEWARE_CLASSESpengaturan Anda .

Arus userada dalam requestobjek, Anda bisa mendapatkannya dengan cara:

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

request.userakan memberi Anda Userobjek yang mewakili pengguna yang saat ini masuk. Jika pengguna saat ini tidak masuk, request.userakan disetel ke instance AnonymousUser. Anda dapat membedakannya dengan bidangnya is_authenticated, seperti:

if request.user.is_authenticated:
    # Do something for authenticated users.
else:
    # Do something for anonymous users.
KZ
sumber
3
Bagaimana jika kita ingin menyetel foreign key userid ke model yang merupakan id pengguna yang saat ini masuk?
Krishnadas PC
Anda tidak perlu lagi memperbarui pengaturan. docs.djangoproject.com/en/1.11/topics/auth/default/…
wooden_metal
2
Dari mana datangnya permintaan?
Sören
Tautan ke referensi Usermodel .
x-yuri
22

Anda dapat mengakses pengguna yang saat ini masuk dengan menggunakan kode berikut:

request.user.id
sriram veeraghanta
sumber
7

Dengan asumsi Anda merujuk ke Pengguna Auth Django , dalam tampilan Anda:

def game(request):
  user = request.user

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

Saya menulis ini dalam tampilan ajax, tetapi ini adalah jawaban yang lebih luas memberikan daftar pengguna yang saat ini masuk dan keluar.

The is_authenticatedatribut selalu kembali Trueuntuk pengguna saya, yang saya kira diharapkan karena hanya memeriksa AnonymousUsers, tapi itu membuktikan berguna jika Anda mengatakan mengembangkan aplikasi chat di mana Anda perlu login pengguna ditampilkan.

Ini memeriksa sesi yang kedaluwarsa dan kemudian mencari tahu pengguna mana yang mereka miliki berdasarkan _auth_user_idatribut yang didekodekan :

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
sumber