Django система уведомлений для одного пользователя
Здравствуйте я хотел бы создать систему уведомлений. Я создал бейдж, который сигнализирует мне об уведомлении на своей странице для просмотра различных уведомлений и через ajax методом GET обновляю количество уведомлений. Не привязываясь к одному пользователю, счетчик остается количеством уведомлений и я бы хотел, чтобы пользователь, нажавший на кнопку "прочитать", уведомление больше не видел и счетчик уменьшался. Но как это сделать для одного пользователя, я могу это сделать, но это будет работать для каждого пользователя, а не для одного и все.
модель
class Notification(models.Model):
date = models.DateField(auto_now_add = True)
title = models.CharField(max_length = 255)
text = models.TextField()
active = models.BooleanField(default = False)
уведомление о просмотре + уведомление о просмотре ajax
def notifiche(request):
if request.is_ajax() and request.method == "POST":
notifica = request.POST['id_notifica']
oggetto = get_object_or_404(Notification, id = notifica)
if oggetto.active == True:
oggetto.active = False
messaggio = "Notifica disattivata"
else:
oggetto.active = True
messaggio = "Notifica attiva sul sito"
oggetto.save()
return JsonResponse({'oggetto': oggetto.active, 'messaggio': messaggio}, status=200)
else:
notifiche = Notification.objects.all()
context = {'notifiche':notifiche, 'popup':popup}
return render(request, 'notifiche.html', context)
def popup(request):
popup = Notification.objects.filter(active = True).count()
return JsonResponse({'popup': popup}, status=200)
snippets/nav.html
<nav class="navbar navbar-expand-lg bg-dark">
<div class="container">
<div class="collapse navbar-collapse justify-content-end">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link text-light" aria-current="page" href="{% url 'notifiche' %}">
Notifiche <span class="badge bg-danger">0</span>
</a>
</li>
</ul>
</div>
</div>
</nav>
Аякс-код в файле base.html
<script>
$.ajax({
url: "/ajax/notifiche/",
type: "GET",
dataType: 'json',
success: function(response){
$("nav span.badge").text(response.popup);
}
});
</script>
Вы можете сделать это многими способами :
Если у каждого пользователя, получающего уведомление, зарегистрировано имя учетной записи, добавьте поле users с чекбоксом или TextField с split("\n")
.Вы также можете использовать куки или данные, хранящиеся локально, и не показывать уведомление, если оно уже было показано однажды (может быть сделано на 100% на js и без системы аккаунтов)
Возможно, больше способов...