Django - "return render(...)" не работает в представлении, которое взаимодействует с ajax-запросом

Я хочу решить такую задачу: я нажимаю кнопку на первой странице, после чего мое представление создает чат и перенаправляет меня на страницу чата.

Я решил использовать ajax запрос для этой задачи, но у меня проблема, мой вид работает до строки return render(request, 'chat/chatroom.html'), чат создается, но chat/chatroom.html страница не открывается, я не понимаю почему. У меня нет ошибок, строка return render(request, 'chat/chatroom.html') ничего не делает.

Мой код:

html

<button type="submit" id="chat-button" value="{{advertisement.author.id}}">Write to the author</button>

<script>
    $(document).on('click', '#chat-button', function (e) {
    e.preventDefault();
    $.ajax({
      type: 'POST',
      url: '{% url "main_app:create-chat" %}',
      data: {
        send_to_id: $('#chat-button').val(),
        csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
        action: 'post'
      },
      success: function (json) {
      },
      error: function (xhr, errmsg, err) {
      }
    });
  })
</script>

views.py

from django.contrib.auth import get_user_model
from django.shortcuts import render, redirect, get_object_or_404
from django.db.models import Q
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt

from chat.models import Thread

User = get_user_model()


@method_decorator(csrf_exempt, name='dispatch')
class CreateChat(View):

    def post(self, request):
        send_to_id = int(request.POST.get('send_to_id'))
        send_to = User.objects.get(id=send_to_id)
        auth_user = request.user
        final_q = Q(Q(first_person=send_to) & Q(second_person=auth_user)) \
                  | Q(Q(first_person=auth_user) & Q(second_person=send_to))
        thread = Thread.objects.filter(final_q)
        if not thread:
            Thread.objects.create(first_person=auth_user, second_person=send_to)

        return render(request, 'chat/chatroom.html')

urls.py

app_name = 'main_app'

urlpatterns = [
    ...
    path('create_chat', CreateChat.as_view(), name='create-chat')
]

Наверное, ajax запрос не лучшее решение, но я не знаю, как реализовать эту функцию другим способом. Спасибо за помощь.

AJAX всегда возвращает запрос, когда он вызван, поэтому вы не можете отобразить его в новом представлении. для этого, когда запрос успешно завершен, верните статус 200 и т.д. при получении ответа об успехе в вызове AJAX. вероятно в

success: function (json) {
      },

перенаправить его в нужное представление. таким образом, код будет выглядеть следующим образом.

from http.client import OK
from django.http import JsonResponse
@method_decorator(csrf_exempt, name='dispatch')
class CreateChat(View):
    
    def get(self,request):
        return render(request, 'chat/chatroom.html')


    def post(self, request):
        send_to_id = int(request.POST.get('send_to_id'))
        send_to = User.objects.get(id=send_to_id)
        auth_user = request.user
        final_q = Q(Q(first_person=send_to) & Q(second_person=auth_user)) \
                  | Q(Q(first_person=auth_user) & Q(second_person=send_to))
        thread = Thread.objects.filter(final_q)
        if not thread:
            Thread.objects.create(first_person=auth_user, second_person=send_to)
        return JsonResponse({},status=OK)

и AJAX запрос будет выглядеть так

<script>
    $(document).on('click', '#chat-button', function (e) {
    e.preventDefault();
    $.ajax({
      type: 'POST',
      url: '{% url "main_app:create-chat" %}',
      data: {
        send_to_id: $('#chat-button').val(),
        csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
        action: 'post'
      },
      success: function (json) {
        location.href = "create-chat" // from here render create-chat  
      },
      error: function (xhr, errmsg, err) {
      }
    });
  })
</script>
Вернуться на верх