Отображение даты присоединения и 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 iflast_logincolumn printsNonethat means the user has not logged even single time. And fordate_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 inTIME_ZONEinsettings.py. The timezone for India isAsia/kolkata, for more info referTime 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)