0

我是一个初学者级别的 Django 开发人员,我正在制作一个医院系统。在医院系统中,我想添加一个通知系统,每当任何患者上传针对医生 ID 的报告时,我想通知医生到医生通知模板,患者(带姓名)的报告已提交。

我试图让它工作 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)
4

1 回答 1

2

您应该创建通知模型,例如:

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

通知过滤器.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>
于 2020-10-31T12:59:12.677 回答