Как получить уведомление о шаблоне, используя сигналы django?

#django #django-views #django-templates #django-signals #django-notification

#django #django-просмотры #django-шаблоны #django-сигналы #django-уведомление

Вопрос:

Я разработчик Django начального уровня, и я создаю систему больницы. В системе больницы я хочу добавить систему уведомлений всякий раз, когда какой-либо пациент загружает отчет по идентификатору врача, я хочу сообщить врачу в шаблон уведомлений врача о том, что отчет пациента (с именем) был отправлен.

Я пытался заставить его работать в течение 2 дней и использовал сигналы для создания сообщения, но я не могу показать его на стороне врача. Пожалуйста, кто-нибудь может сказать мне, как я могу сделать это проще или я должен использовать что-то другое вместо сигналов.

Предыдущий код, который я пробовал.

 from django.shortcuts import render, HttpResponse,request
from hospital.models import Patient ,Doctor,Report
from django.db.models.signals import post_save,pre_save

def save_report(sender,instance,**kwargs):
    instance = Patient.objects.get(id=1)
    dr_id= instance.assignedDoctorId
    patient=models.Patient.objects.get(user_id=request.user.id)
    doctor=models.Doctor.objects.get(id=dr_id)
    notifications=print("New report has been submitted")
    mydict={
    'doctor':doctor,
    'patient':patient,
    'notifications':notifications
    }
    return render(request,'temp/doctor_Notifications.html',context=mydict)

post_save.connect(save_report,sender=Report)
  

Ответ №1:

Вы должны создать модель уведомления, например:

 class Notification(models.Model):
    person = models.ForeignKey(Mymodel, on_delete=models.CASCADE)
    is_read = models.BooleanField(default=False)
    message = models.TextField(max_length=100)
  

В ваших представлениях просто создавайте уведомление всякий раз, когда пациент отправляет отчет:

 def save_report(sender,instance,**kwargs):
    instance = Patient.objects.get(id=1)
    dr_id= instance.assignedDoctorId
    patient=models.Patient.objects.get(user_id=request.user.id)
    doctor=models.Doctor.objects.get(id=dr_id)
    Notification.objects.create(person=doctor, message=f'{instance} sent you a report!')
    mydict={
    'doctor':doctor,
    'patient':patient,
    }
    return render(request,'temp/doctor_Notifications.html',context=mydict)
  

Создать представление для отображения уведомлений с переключением на чтение при запуске:

 class NotificationListView(ListView):
    model = Notification
    template_name = 'users/notifications.html'

    def get_queryset(self):
        notifications = Notification.objects.filter(person=self.request.user).all()
        notifications.update(is_read=True)
        return notifications
  

шаблон с уведомлениями:

 {% block content %}
    {% for notification in object_list %}
        <h6>{{ notification.message }}</h6>
    {% endfor %}
{% endblock %}
  

Если у вас есть панель навигации на вашем сайте, вы, вероятно, хотите отобразить количество непрочитанных уведомлений. Сначала вам нужно отфильтровать непрочитанные уведомления:
В папке вашего приложения создайте новую под названием «templatetags» и внутри создайте: init.py и notifilter.py например.

 -yourApp
 -templatetags
  -__init__.py
  -notifilter.py
  

notifilter.py

 from django import template

register = template.Library()

@register.filter
def notifilter(args):
    filtered = []
    for i in args:
        if i.is_read == False:
            filtered.append(i)
    return filtered
  

загрузите фильтр в шаблон, когда у вас есть панель навигации, и добавьте строку, как показано ниже:

 {% load notifilter %}
<a class="nav-link" href="{% url 'notifications' %}">notifications({{ request.user.profile.notification_set.all|notifilter|length }})</a>