Отображение даты присоединения и last_login в Django

У меня есть модель User по умолчанию Django User для регистрации пользователя. Я хочу выводить в шаблоне дату последнего_логина и дату присоединения пользователя. А также я хочу проверить, активен ли пользователь или нет.

Я хочу проверить активный статус пользователя следующим образом, Если пользователь в настоящее время использует мой сайт, то статус должен быть "Активен" Если пользователь вышел из системы, то статус должен быть "Вышел". если это возможно, пожалуйста, предоставьте мне решение и для этого

Я фильтрую данные пользователя следующим образом

data = Profile.objects.filter(Q(user__is_superuser=False), Q(user__is_staff=False)).order_by('-user__last_login')[:10]

Model.py

class Profile(models.Model):
user = models.OneToOneField(User,default="1", on_delete=models.CASCADE)   
image = models.ImageField(upload_to="images",default="default/user.png")

def __str__(self):
return f'{self.user} profile'

создайте signals.py и добавьте этот фрагмент:

from django.contrib.auth.signals import user_logged_in,user_logged_out
from datetime import datetime

@receiver(user_logged_in)
def user_logged(sender,request,user,**kwargs):
    user.profile.last_login = datetime.now()
    user.profile.save()

добавьте атрибут related_name к полю пользователя под вашей моделью Profile:

class Profile(models.Model):
    user = models.OneToOneField(User,default="1", on_delete=models.CASCADE, related_name="profile")   
    image = models.ImageField(upload_to="images",default="default/user.png")
    date_joined = models.DateTimeField()

    def save(self, *args, **kwargs) -> None:
        self.date_joined = datetime.now()
        return super().save(*args, **kwargs)

    def __str__(self):
        return f'{self.user} profile'

запустить на терминале:

python manage.py makemigrations    

python manage.py migrate

официальная документация

Выпуск:

Только last_login и date_joined являются допустимыми полями в стандартной User модели django.

Не используйте request.user....., так как он выводит данные о текущих вошедших в систему пользователях, а вы указали, что я хочу, чтобы он отображался для всех пользователей.

Question 1: Но эта строка <td> {{request.user.profile.date_joined }}</td> выводит дату входа текущего пользователя, но я хочу показать дату последнего_входа всех пользователей.

Answer: Это потому, что request... дает вам данные текущего вошедшего пользователя, а не данные всех пользователей.

Question 2: И эта строка <td>{{ request.user.profile.last_login }} </td> ничего не печатает.

Answer: Это потому, что существует неправильная взаимосвязь моделей.



Решение:

Попробуйте следующий код в файле шаблона для отображения всех пользователей:

<td> {{userData.user.last_login }}</td>
<td>{{ userData.user.date_joined }} </td>

Вместо этого кода вы пробовали:

<td> {{request.user.profile.date_joined }}</td>
<td>{{ request.user.profile.last_login }} </td>

Remember: Here, you have filtered only those users which are not staff as well as superuser, so these users are normal users. And if last_login column prints None that means the user has not logged even single time. And for date_joined,by default current time is taken by django. And if you see another time than your local machine that means you haven't set time zone in TIME_ZONE in settings.py. The timezone for India is Asia/kolkata, for more info refer Time zones[django-doc].

Вы можете отфильтровать тех пользователей, которые вошли в систему хотя бы один раз через Q(user__last_login__isnull=False).

Попробуйте выполнить этот запрос в представлении:

views.py

def admin_home(request):
    data = Profile.objects.filter(Q(user__is_superuser=False), Q(
        user__is_staff=False), Q(user__last_login__isnull=False)).order_by('-user__last_login')[:10]
    context = {
        'data': data,
    }
    return render(request, "instructor/admin_home.html", context)
Вернуться на верх