仅在用户发送消息时保存聊天线程
Save chat thread only if user sends a message
我在我的 Django 2 项目中使用 Django Channels 2.1.2,需要一些帮助来将线程配置为仅在用户实际发送消息时才保存。
现在,如果用户点击 chat
,他们会转到聊天消息页面,线程会创建并保存在他们的收件箱中。
即使他们决定不结束消息传递,空聊天在两个用户的收件箱中仍然可见。
只有在任一用户发送消息后才需要保存线程。
有人介意帮我解决这个问题吗,因为我不确定该怎么做?我假设这条线需要以某种方式修改 obj, created = Thread.objects.get_or_new(self.request.user, other_username)
views.py
class InboxView(LoginRequiredMixin, ListView):
template_name = 'chat/inbox.html'
context_object_name = 'threads'
def get_queryset(self):
return Thread.objects.by_user(self.request.user).order_by('-timestamp')
# by_user(self.request.user)
class ThreadView(LoginRequiredMixin, FormMixin, DetailView):
template_name = 'chat/thread.html'
form_class = ComposeForm
success_url = '#'
def get_queryset(self):
return Thread.objects.by_user(self.request.user)
def get_object(self):
other_username = self.kwargs.get("username")
obj, created = Thread.objects.get_or_new(self.request.user, other_username)
if obj == None:
raise Http404
return obj
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'] = self.get_form()
return context
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseForbidden()
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
thread = self.get_object()
user = self.request.user
message = form.cleaned_data.get("message")
ChatMessage.objects.create(user=user, thread=thread, message=message)
return super().form_valid(form)
有多种方法可以做到这一点:
- 修改您的 Thread 视图,使其在没有 Thread 的情况下也可用 - 也许将所需的数据添加到您的上下文中,然后在发送消息时使用 get_or_create
- 更简单但更懒惰的方法是在您的收件箱视图中不显示任何空线程 - 在您的 get_queryset 中,您可以过滤仅在
中有消息的线程
问题是 models.py 中用户和 other_username 之间的比较总是返回 None,因为它们相等
def get_or_new(self, user, other_username): # get_or_create
username = user.username
if username == other_username: <-----
return None
在 views.py 您可以创建一个虚拟用户进行比较,代码将起作用
def get_object(self):
other_username = "user1" <------
obj, created = Thread.objects.get_or_new(self.request.user, other_username)
我在我的 Django 2 项目中使用 Django Channels 2.1.2,需要一些帮助来将线程配置为仅在用户实际发送消息时才保存。
现在,如果用户点击 chat
,他们会转到聊天消息页面,线程会创建并保存在他们的收件箱中。
即使他们决定不结束消息传递,空聊天在两个用户的收件箱中仍然可见。
只有在任一用户发送消息后才需要保存线程。
有人介意帮我解决这个问题吗,因为我不确定该怎么做?我假设这条线需要以某种方式修改 obj, created = Thread.objects.get_or_new(self.request.user, other_username)
views.py
class InboxView(LoginRequiredMixin, ListView):
template_name = 'chat/inbox.html'
context_object_name = 'threads'
def get_queryset(self):
return Thread.objects.by_user(self.request.user).order_by('-timestamp')
# by_user(self.request.user)
class ThreadView(LoginRequiredMixin, FormMixin, DetailView):
template_name = 'chat/thread.html'
form_class = ComposeForm
success_url = '#'
def get_queryset(self):
return Thread.objects.by_user(self.request.user)
def get_object(self):
other_username = self.kwargs.get("username")
obj, created = Thread.objects.get_or_new(self.request.user, other_username)
if obj == None:
raise Http404
return obj
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'] = self.get_form()
return context
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return HttpResponseForbidden()
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
thread = self.get_object()
user = self.request.user
message = form.cleaned_data.get("message")
ChatMessage.objects.create(user=user, thread=thread, message=message)
return super().form_valid(form)
有多种方法可以做到这一点:
- 修改您的 Thread 视图,使其在没有 Thread 的情况下也可用 - 也许将所需的数据添加到您的上下文中,然后在发送消息时使用 get_or_create
- 更简单但更懒惰的方法是在您的收件箱视图中不显示任何空线程 - 在您的 get_queryset 中,您可以过滤仅在 中有消息的线程
问题是 models.py 中用户和 other_username 之间的比较总是返回 None,因为它们相等
def get_or_new(self, user, other_username): # get_or_create
username = user.username
if username == other_username: <-----
return None
在 views.py 您可以创建一个虚拟用户进行比较,代码将起作用
def get_object(self):
other_username = "user1" <------
obj, created = Thread.objects.get_or_new(self.request.user, other_username)