我正在尝试使用Django频道创建聊天应用程序。我已经成功构建了一个一对一的聊天应用程序,但是我没有将其扩展到多个一对一聊天的想法。就像,现在只有两个用户登录,但是如果有多个用户彼此聊天该怎么办。我被困在如何为此准备模型以及如何在数据库中插入数据。因此,如果有人可以提供帮助,我将不胜感激。
models.py
class Chat(models.Model):
room = models.CharField(max_length = 255, null = True)
user = models.ForeignKey(User, on_delete = models.SET_NULL, null = True)
message = models.TextField()
time = models.DateTimeField(auto_now_add = True, null = True)
def __str__(self):
return self.user.username
views.py
def student_messages(request, pk):
student = Student.objects.get(id = pk)
chat = Chat.objects.filter(room = request.user)
if request.is_ajax():
print(request.POST.get('chat'))
Chat.objects.create(user = student.user, message = request.POST.get('chat'), room = request.user)
return render(request, "main/student_messages.html", {"student": student, "chat": chat})
def instructor_messages(request, pk):
instructor = Instructor.objects.get(id = pk)
chat = Chat.objects.filter(room = request.user)
notify = InstructorCourseNotification.objects.filter(instructor = instructor).order_by('-id')[:3]
if request.is_ajax():
print(request.POST.get('chat'))
Chat.objects.create(user = instructor.user, message = request.POST.get('chat'), room = request.user)
return render(request, "main/instructor_messages.html", {"instructor": instructor, "chat": chat, "notify": notify})
consumers.py
class chatConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
await self.accept()
await self.channel_layer.group_add("chat", self.channel_name)
print(f"{self.channel_name}")
async def disconnect(self, code):
await self.channel_layer.group_discard("chat", self.channel_name)
print(f"removed {self.channel_name}")
async def user_chat(self, event):
await self.send_json(event)
print(f"{event}")
signals.py
@receiver(post_save, sender=Chat)
def chat_notification(sender, instance, created, **kwargs):
if created:
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)(
"chat",
{
"type": "user.chat",
"event": "New Chat",
"user": instance.user.id,
"message": instance.message,
"time": json.dumps(instance.time.strftime("%d"), cls = DjangoJSONEncoder)
})
问题是在当前的实现中,我也无法成功保存整个聊天记录。仅保存各个用户发送的消息。