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

Django 仅当用户发送消息时保存聊天线程,django,django-models,django-views,django-channels,Django,Django Models,Django Views,Django Channels,我在Django 2项目中使用Django Channel 2.1.2,需要一些帮助来配置线程,以便仅在用户实际发送消息时保存线程 现在,如果用户单击chat,他们会进入聊天信息页面,该线程将被创建并保存在他们的收件箱中 即使他们决定不发送消息,两个用户的收件箱中仍然可以看到空聊天 只有在任一用户发送消息后,才需要保存线程 我不知道该怎么办,有人能帮我吗?我假设这行需要修改obj,created=Thread.objects.get\u或\u newself.request.user,other

我在Django 2项目中使用Django Channel 2.1.2,需要一些帮助来配置线程,以便仅在用户实际发送消息时保存线程

现在,如果用户单击chat,他们会进入聊天信息页面,该线程将被创建并保存在他们的收件箱中

即使他们决定不发送消息,两个用户的收件箱中仍然可以看到空聊天

只有在任一用户发送消息后,才需要保存线程

我不知道该怎么办,有人能帮我吗?我假设这行需要修改obj,created=Thread.objects.get\u或\u newself.request.user,other\u 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)

这有多种方法:

修改您的线程视图,使其在没有线程的情况下可用-可以将所需的数据添加到您的上下文中,然后在发送消息时,使用get\u或\u create 更容易但更懒惰的方法是在收件箱视图中不显示任何空线程-在get_queryset中,您可以筛选只在其中显示消息的线程
问题是models.py中的user和其他_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)

非常感谢,我将选择第二个选项,因为这将暂时奏效。对于只包含消息的线程,实际的queryset语法是什么?我使用.excludechatmessage\uuuuu isnull=True来实现