django

时间:2015-11-11 00:48:50

标签: 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的新消息对象,我需要向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 个答案:

答案 0 :(得分: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})