Я пытаюсь создать систему уведомлений, но у меня возникают проблемы с этим.
вот мой код:
Я создал модель уведомлений, где каждая запись является уведомлением. Каждый раз, когда в мою модель SalesTask делается новая запись, она вызывает мой обработчик сигнала, который создает новую запись в моей модели уведомлений. Затем я передам эту модель в свой контекст и отобразлю ее в моем HTML.
class Notifications(models.Model):
notifications_id = models.AutoField(primary_key=True)
user = models.ForeignKey(User)
time = models.DateTimeField(auto_now=True)
message = models.TextField(max_length=100 ,default ='test')
object_url = models.CharField(max_length=500, default ='test')
is_read = models.BooleanField(default=False)
def CreateTaskNotification(sender,**kwargs):
if kwargs['created']:
notification = Notifications.objects.create(user = kwargs['instance'].salesExtra.username,
message = 'You have been assigned a new task',
object_url = kwargs['instance'].get_absolute_url(self)
)
post_save.connect(CreateTaskNotification,sender=SalesTask)
Проблема заключается в том, что мои модели SalesTask:
class SalesTask(models.Model):
sales_status= (
('p1','Phase 1'),
('p2','Phase 2'),
('p3','Phase 3'),
('p4','Phase 4'),
)
sales_priority= (
('Urgent','Urgent'),
('Medium','Medium'),
('Low','Low'),
)
task_id = models.AutoField(primary_key=True)
salesExtra= models.ManyToManyField('SalesExtra')
sales_project= models.ForeignKey('SalesProject',on_delete=models.CASCADE)
title = models.TextField(max_length=50 , default='Your Title' )
description = models.TextField(max_length=200 , default='Your Description' )
priority = models.TextField(max_length=10 , choices= sales_priority ,default='Low' )
date_time = models.DateTimeField(auto_now=True)
status = models.TextField(max_length=10, choices= sales_status ,default='p1')
due_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return str(self.task_id)
def get_absolute_url(self):
return reverse('sales-task')
имеют поле «многие ко многим» с расширенной моделью модели «Пользователь» (SalesExtra). Это наиболее вероятно, почему я получаю сообщение об ошибке:
'ManyRelatedManager' object has no attribute 'user'
Это мои взгляды на создание нового экземпляра задачи:
class SalesTaskDetailView(CreateView):
model = SalesTaskingComments
template_name = 'rnd/task_details.html'
fields = ['comment']
exclude = ['comment_id']
def get_context_data(self, **kwargs):
pk = self.kwargs['pk']
context = super(SalesTaskDetailView, self).get_context_data(**kwargs)
context['sales_task'] = SalesTask.objects.filter(task_id = pk)
context['comments'] = SalesTaskingComments.objects.filter(salesTask__task_id__contains= pk)
return context
def form_valid(self, form):
task = get_object_or_404(SalesTask, task_id=self.kwargs['pk'])
user = get_object_or_404(SalesExtra, user=self.request.user)
form.instance.salesTask = task
form.instance.salesExtras = user
return super(SalesTaskDetailView, self).form_valid(form)
Поэтому мой вопрос: 1. Есть ли способ создать новую запись для каждого объекта SalesExtra? 2. Это лучший метод для создания системы уведомлений? (Я использую django 3.0, поэтому многие приложения, такие как django -notifications или django -activities-stream, не совместимы.)