如何在 Django 聊天应用程序中创建对话列表

问题描述

我正在尝试向我用 Django 制作的网络应用程序添加消息传递功能

到目前为止,我已经成功地在用户之间发送和接收消息。

但是,现在我一直在向登录用户inBox.html 页面显示所有对话列表。

我尝试了我能想到的不同方法,但都没有得到预期的结果。

models.py

class Messaging(models.Model):
    sender = models.ForeignKey(User,on_delete=models.CASCADE,related_name='sender')
    receiver = models.ForeignKey(User,related_name='receiver')
    message_text = models.TextField(max_length=360,verbose_name='Write Message')
    message_date = models.DateTimeField(auto_Now_add=True)

    def __str__(self):
        return f'{self.sender}\'s Message to {self.receiver}'

viwes.py 用户用户发送和接收消息的功能

@login_required
def messageview(request,user_name):
    sender_user = request.user
    receiver_user = User.objects.get(username=user_name)
    message_list = Messaging.objects.filter(sender=sender_user,receiver=receiver_user).order_by('message_date') | \
                   Messaging.objects.filter(receiver=sender_user,sender=receiver_user).order_by('message_date')



    if request.method == 'POST':
        msg_text = request.POST.get('msg_text')
        messaging = Messaging()
        messaging.sender = sender_user
        messaging.receiver = receiver_user
        messaging.message_text = msg_text
        messaging.save()

        return redirect(request.Meta['HTTP_REFERER'])

    context = {
        'sender_user': sender_user,'receiver_user': receiver_user,'message_list': message_list,}
    return render(request,'message.html',context)

现在我想在 inBoxview 中创建一个 views.py 来呈现登录用户的所有对话。

假设我在数据库 A 和 B 中有两个用户,他们之间交换了 4 条消息。我想要的是将对话显示一个列表,在这种情况下只有一个。例如,登录用户是A,他与用户B 和C 交换消息。收件箱将显示两行。当用户A点击其中任何一行时,他将被带到该用户对应的详细信息页面。它有点像 WhatsApp 或 Messenger。希望我能解释一下。

已编辑:添加示例图片以便更好地理解

我能够做到这一点:

Conversation

我需要帮助来做到这一点:

Conversation List

请给我指路。

解决方法

你可以尝试这样的事情。

此视图将查询 Messaging 模型并获取 senderreceiver 是登录用户的所有条目。

@login_required
def inbox(request,user):
    # Get all the records where either sender OR receiver is the logged in user
    messages = Messaging.objects.filter(sender=request.user) | Messaging.objects.filter(receiver=request.user)

    context = {'messages': messages}

    return render(request,'inbox.html',context)

您可以在上述代码中添加任何符合您要求的额外代码行。

inbox.html

{% for message in messages %}
   # You can show your message details here
{% endfor %}