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
Читайте документацию внимательней
from django.contrib.auth.backends import BaseBackend
class MyBackend(BaseBackend):
...
Answered by eri on November 22, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP