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 и без системы аккаунтов)

Возможно, больше способов...

Вернуться на верх