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

时间:2021-07-30 05:45:43

标签: python django django-models django-queryset django-messages

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

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

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

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

models.py

class Messaging(models.Model):
    sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')
    receiver = models.ForeignKey(User, on_delete=models.CASCADE, 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

请给我指路。

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。

此视图将查询 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 %}