TransWikia.com

Как добавить статус онлайн на сайте

Stack Overflow на русском Asked by Anton Balmakov on November 22, 2021

Есть сайт с регистрацией и всё что с ней связано. Хочу добавить статус 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

One Answer

Читайте документацию внимательней

from django.contrib.auth.backends import BaseBackend

class MyBackend(BaseBackend):
...

Answered by eri on November 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP