如何在 Django 的聊天应用程序中显示最后 25 条消息

How to display last 25 messages in a chat application in Django

我正在用 Django 构建一个聊天应用程序。但是我在显示聊天的最后 25 条消息时遇到问题。这是我的代码.... 这是我用于保存消息的模型

from django.contrib.auth import get_user_model
from django.db import models

class Message(models.Model):
    username = models.CharField(max_length = 255)
    room = models.CharField(max_length = 255)
    content = models.TextField()
    date_added = models.DateTimeField(auto_now_add = True)

class Meta:
    ordering = ('date_added', )

这是过滤消息并在 views 中呈现模板的函数:

@login_required(login_url = 'index')
def room(request, room_name):
    messages = Message.objects.filter(room = room_name)[:25:]
    return render(request, 'chatroom.html', {
        'room_name': room_name,
        'messages': messages
    })

这是应该在 chatroom.html 模板 中显示消息的部分:

      <div class="container_chat">    
        <form>
            <div class="textarea" id="chat-text" rows="10" readonly> {% for m in messages %} <b> {{ m.username }} </b>: {{ m.content }} <br> {% endfor %} </div> 
            <div class=container_chat_inputs>
                <input id="input" placeholder="Enter a message" type="text"></br>
                <input class="chat_message_submit" id="submit" type="button" value="Send">
            </div>
        </form>
    </div>

这是我在 consumers 模型中保存消息的函数:

    @sync_to_async
    def save_message(self, username, room, message):
        Message.objects.create(username = username, room = room, content = message)

到目前为止,我认为主要问题在于 views 中的过滤。现在它似乎只显示 25 条消息。我试过反转切片,但 Django 不支持负切片。我也试过颠倒顺序,确实显示了 最后 25 条消息,但当然是颠倒顺序。

问题:我该如何解决这个问题?如何显示最后 25 条消息?

由于您必须保持消息的顺序,您可以这样做:

messages = Message.objects.filter(room = room_name)
total_msgs = len(messages)
if total_msgs > 25:
    last_msgs = messages[total_msgs-25::]
else:
    last_msgs = messages
return render(request, 'chatroom.html', {
        'room_name': room_name,
        'messages': last_msgs
    })