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

时间:2019-03-18 12:50:52

标签: django django-models django-views django-channels

我在我的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)

2 个答案:

答案 0 :(得分:1)

They are multiple ways of doing this:

  1. Modify your Thread View, so that it is usable without a Thread - maybe add the data that is required into your context, and then when a message is sent, use get_or_create
  2. The easier but lazier is to not have any Empty Threads show in your Inbox View - in your get_queryset, you can filter for Threads that only have messages within

答案 1 :(得分:0)

问题是用户和models中的other_username之间的比较。py总是返回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)
相关问题