Сохранить тему чата, только если пользователь отправляет сообщение - PullRequest
0 голосов
/ 18 марта 2019

Я использую Django Channels 2.1.2 с моим проектом Django 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 Ответ

1 голос
/ 19 марта 2019

Это можно сделать несколькими способами:

  1. Измените представление потока, чтобы его можно было использовать без потока, - возможно, добавьте необходимые данные в ваш контекст, а затем, когда появится сообщениеотправлено, используйте get_or_create
  2. Легче, но ленивее не показывать пустые темы в вашем представлении входящих сообщений - в вашем наборе get_query вы можете фильтровать потоки, которые имеют сообщения только в пределах
...