2015-11-11 108 views
1

我在我的学习项目中有简单的消息模型。django中的消息通知

class Message(models.Model): 

    sender = models.ForeignKey(CustomUser, related_name='sender') 
    reciever = models.ForeignKey(CustomUser, related_name='reciever') 
    text = models.TextField() 
    created_at = models.DateTimeField(auto_now_add=True) 

我该如何向request.user发送有关新消息的通知。
即我需要通知发送到request.user如果我有request.user新Message对象reciever

UPD我的观点:

def dialog(request, user_pk): 

    sent = Message.objects.filter(reciever_id=user_pk, sender_id=request.user.pk) 
    recieved = Message.objects.filter(reciever_id=request.user.pk, sender_id=user_pk) 
    mate = CustomUser.objects.get(pk=user_pk) 

    dialog_list = sorted(chain(sent, recieved), key=lambda a:a.created_at) 

    if request.POST: 

     form = MessageForm(request.POST) 
      if form.is_valid(): 
       f = form.save(commit=False) 
       f.sender = CustomUser.objects.get(pk=request.user.pk) 
       f.reciever = CustomUser.objects.get(pk=user_pk) 
       form.save() 
    else: 
     form=MessageForm() 

    return render(request, 'dialog.html', {'sent':sent, 
    'recieved':recieved, 'form':form, 'mate':mate, 'dialog_list':dialog_list}) 

看是这样的: enter image description here

+1

这是一个很广泛的问题;如果你可以更具体地说明你正在尝试做什么,或者你已经尝试过那些没有奏效的东西,那将会很有帮助。 – nthall

+0

我只是想建议。我想我需要在我的'Message'模型中使用标志,就像request.user中的“被查看”和“不”。然后通过'request.user'在我的数据库中检查“not viewed”'Message.reciever'。但我现在不怎么能做到这一点 –

+1

那么,未读的国旗是一个好主意。 [BooleanField](https://docs.djangoproject.com/en/1.8/ref/models/fields/#booleanfield)是您想要的字段。然后,在适当的视图中,您可以使用[queryset filtering](https://docs.djangoproject.com/en/1.8/topics/db/queries/#retrieving-specific-objects-with-filters)检查消息。 – nthall

回答

0

我解决了这个问题,通过制作一些难看的逻辑
用布尔字段更新我的模型:

class Message(models.Model): 

    sender = models.ForeignKey(CustomUser, related_name='sender') 
    reciever = models.ForeignKey(CustomUser, related_name='reciever') 
    text = models.TextField(verbose_name='') 
    created_at = models.DateTimeField(auto_now_add=True) 
    is_readed = models.BooleanField(default=False) 

鉴于我创建set我的消息,并在这里添加用户,谁拥有is_readed == False
消息它成为True当我们加载对话页面与该用户
我从来没有在真正的项目工作,但我认为这种解决方案不可接受这里。
反正在我的第一个研究项目它的工作,也许帮助一些新手,像我这样的强调文本

def dialog(request, user_pk): 

    sent = Message.objects.filter(reciever_id=user_pk, sender_id=request.user.pk) 
    recieved = Message.objects.filter(reciever_id=request.user.pk, sender_id=user_pk) 
    not_readed = set() 

    for message in recieved: 
     message.is_readed = True 
     message.save() 

    for message in Message.objects.filter(reciever_id=request.user.pk): 
     if message.is_readed ==False: 
      not_readed.add(CustomUser.objects.get(pk=message.sender_id)) 

    dialog_list = sorted(chain(sent, recieved), key=lambda a:a.created_at) 

    if request.POST: 

     form = MessageForm(request.POST) 
     if form.is_valid(): 
      f = form.save(commit=False) 
      f.sender = CustomUser.objects.get(pk=request.user.pk) 
      f.reciever = CustomUser.objects.get(pk=user_pk) 
      form.save() 
    else: 
     form=MessageForm() 

    return render(request, 'dialog.html', {'sent':sent, 
    'recieved':recieved, 'form':form, 'mate':mate, 
    'dialog_list':dialog_list, 'not_readed':not_readed})