仅在用户发送消息时保存聊天线程

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)

有多种方法可以做到这一点:

  1. 修改您的 Thread 视图,使其在没有 Thread 的情况下也可用 - 也许将所需的数据添加到您的上下文中,然后在发送消息时使用 get_or_create
  2. 更简单但更懒惰的方法是在您的收件箱视图中不显示任何空线程 - 在您的 get_queryset 中,您可以过滤仅在
  3. 中有消息的线程

问题是 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)