Django 重定向以查看 kwarg 不工作
Django redirect to view with kwarg not working
我的目标是将客户端重定向到聊天会话详细信息视图,如果他们试图与他们已经聊天的人打开一个新的聊天会话。一切正常,但是当我尝试打开一个重复的聊天会话时,它没有被重定向,我得到的只是一个空白 json 响应
//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')
]
您可以不 return perform_create
中的 HTTP 响应。 perform_create
只应该使用序列化器数据创建一个新对象:它使用 request.data
创建一个序列化器,然后检查序列化器是否有效,然后执行创建。
您可以做的是覆盖 create
方法:
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)
我的目标是将客户端重定向到聊天会话详细信息视图,如果他们试图与他们已经聊天的人打开一个新的聊天会话。一切正常,但是当我尝试打开一个重复的聊天会话时,它没有被重定向,我得到的只是一个空白 json 响应
//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')
]
您可以不 return perform_create
中的 HTTP 响应。 perform_create
只应该使用序列化器数据创建一个新对象:它使用 request.data
创建一个序列化器,然后检查序列化器是否有效,然后执行创建。
您可以做的是覆盖 create
方法:
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)