如何在 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
})
我正在用 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
})