Home > front end >  Django redirect to view with kwarg not working
Django redirect to view with kwarg not working

Time:01-15

My goal is to redirect the client to the chat session detail view if they are trying to open a new chat session with someone they already have a chat session with. Everything works fine but when I tried to open a duplicate chat session, it didnt get redirected and all what i got is a blank json response

//views.py

class ChatSessionListView(generics.ListCreateAPIView):
serializer_class = ChatSessionSerializer
permission_classes = [permissions.IsAuthenticated]

def get_queryset(self):
    return ChatSession.objects.filter(Q(initiator=self.request.user) | Q(receiver=self.request.user))

def perform_create(self, serializer):
    receiver_username = self.request.data['username']
    receiver = get_object_or_404(User, username=receiver_username)
    chat_session = ChatSession.objects.filter(Q(initiator=self.request.user, receiver=receiver) | Q(initiator=receiver, receiver=self.request.user))
    if chat_session.exists():
        return redirect('v1:chat:chat_session_detail', session_id=chat_session[0].pk)
    else:
        serializer.save(initiator=self.request.user, receiver=receiver)

// urls.py

urlpatterns = [
path('', views.ChatSessionListView.as_view(), name='chat'),
path('<str:session_id>/', views.ChatSessionDetailView.as_view(), name='chat_session_detail')

]

CodePudding user response:

You can not return a HTTP response in perform_create. perform_create is only supposed to create a new object with the serializer data: it creates a serializer with request.data, then checks if the serializer is valid, and then performs the create.

What you can do is override the create method:

 class ChatSessionListView(generics.ListCreateAPIView):
    serializer_class = ChatSessionSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        return ChatSession.objects.filter(Q(initiator=self.request.user) | Q(receiver=self.request.user))

    def create(self, request, *args, **kwargs):
        receiver = get_object_or_404(User, username=self.request.data['username'])
        chat_sessions = ChatSession.objects.filter(
            Q(initiator=self.request.user, receiver=receiver) |
            Q(initiator=receiver, receiver=self.request.user)
        )
        chat_session = chat_sessions.first()
        if chat_session is None:
            serializer = ChatSessionSerializer(data=request.data)
            if serializer.is_valid():
              chat_session = serializer.save(initiator=self.request.user, receiver=receiver)        
       return redirect('v1:chat:chat_session_detail', session_id=chat_session.pk)
  •  Tags:  
  • Related