Как добавить статус онлайн на сайте
Есть сайт с регистрацией и всё что с ней связано. Хочу добавить статус online к пользователям Есть модель:
class AdvUser(AbstractUser): # Студенты
surname = models.CharField(max_length=30 ,db_index=True, verbose_name="Отчество", blank=True)
img_user = models.ImageField('Аватар', upload_to='images/user/', blank=True)
phone = models.CharField(max_length=30 , verbose_name="Номер телефона", blank=True)
last_online = models.DateTimeField(blank=True, null=True)
# В данном методе проверяем, что дата последнего посещения не старше 15 минут
def is_online(self):
if self.last_online:
return (timezone.now() - self.last_online) < timezone.timedelta(minutes=10)
return False
# Если пользователь посещал сайт не более 15 минут назад,
def get_online_info(self):
if self.is_online():
# то возвращаем информацию, что он онлайн
return _('Online')
if self.last_online:
# иначе пишем сообщение о последнем посещении
return _('Last visit {}').format(naturaltime(self.last_online))
# Если вы только недавно добавили информацию о посещении пользователем сайта
# то для некоторых пользователей инфомации о посещении может и не быть, вернём информацию, что последнее посещение неизвестно
return _('Unknown')
def __str__(self):
return f"{self.first_name} {self.last_name}"
class Meta:
verbose_name = 'Пользователь'
verbose_name_plural = 'Пользователи'
Есть файл backends.py
from django.contrib.auth import get_user_model
from django.utils import timezone
class MyBackend:
def get_user(self, user_id):
try:
user = get_user_model().objects.get(pk=user_id)
user.last_online = timezone.now() # При запросе пользователя выполним обновлении даты и времени последнего посещения
user.save(update_fields=['last_online'])
return user
except get_user_model().DoesNotExist:
return None
В settings:
AUTH_USER_MODEL = 'manager_school.AdvUser'
AUTHENTICATION_BACKENDS = (
'manager_school.backends.MyBackend',
'django.contrib.auth.backends.ModelBackend',)
Вo views
def all_users(request):
users = AdvUser.objects.all()
context = {"users": users}
return render(request, "all_users.html", context)
И вывод данных на шаблоне
{% load static%}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>Список студентов</h2>
<table>
<tr>
<th>Имя</th>
<th>Телефон</th>
<th>Изображение</th>
<th>Статус</th>
</tr>
{% for user in users %}
<tr>
<td>{{ user.first_name }}</td>
<td>{{ user.phone }}</td>
{% if user.img_user %}
<td><img src="{{ user.img_user.url }}" width="100" height="100" alt="test"></td>
{% else %}
<td>...</td>
{% endif %}
<td>{{ user.get_online_info }}</td>
{% endfor %}
</tr>
</table>
Но после того как я сделал миграции и всё что нужно для запуска. При попытке войти в adminку
я получаю ошибку 'MyBackend' object has no attribute 'authenticate'. Помогите разобраться! Версия Django 3.0.8
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Читайте документацию внимательней
from django.contrib.auth.backends import BaseBackend
class MyBackend(BaseBackend):
...
