API-интерфейс restjable, основанный на Django, отображает как PUT, так и POST-форму, когда он должен отображать только POST-форму. - PullRequest
0 голосов
/ 10 мая 2018

enter image description here

Обычно при переходе по URL-адресу http://localhost:8000/api/v1/public_profiles/ с использованием ModelViewSet я получаю только форму POST, а при переходе к определенному ресурсу, например http://localhost:8000/api/v1/public_profiles/123456/, я получаю только форму PUT / PATCH , В настоящее время обе формы отображаются в обоих местах.

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

class PublicProfileViewSet(viewsets.GenericViewSet, generics.ListCreateAPIView, generics.RetrieveUpdateAPIView):
    queryset = PublicProfile.objects.all()

    def get_serializer_class(self):
        if self.action == 'list':
            return PublicProfileReadSerializer
        elif self.action == 'retrieve':
            return PublicProfileReadSerializer
        elif self.action == 'create':
            return PublicProfileCreateSerializer
        elif self.action == 'update':
            return PublicProfileUpdateSerializer
        else:
            return PublicProfileReadSerializer

Могу ли я что-нибудь сделать, чтобы исправить это, чтобы форма POST отображалась в действии LIST, а форма PUT / PATCH - в действии RETRIEVE?

Одна вещь, которую я попробовал, - это использовать ViewSet, но тогда я не получаю сгенерированные формы, потому что нет 'serializer_class':

class PublicProfileViewSet(viewsets.ViewSet):

     def list(self, request):
         queryset = PublicProfile.objects.all()
         serializer = PublicProfileReadSerializer(queryset, many=True, context={'request': request})
         return Response(serializer.data)

     def retrieve(self, request, pk=None):
         queryset = PublicProfile.objects.all()
         public_profile = get_object_or_404(PublicProfile, pk=pk)
         serializer = PublicProfileReadSerializer(public_profile, context={'request': request})
         return Response(serializer.data)

     def create(self, request):
         serializer = PublicProfileCreateSerializer(data=request.data, context={'request': request})
         if serializer.is_valid(raise_exception=True):
             serializer.save()
             return Response(serializer.data)

     def update(self, request, pk=None):
         instance = get_object_or_404(PublicProfile, pk=pk)
         serializer = PublicProfileUpdateSerializer(instance, data=request.data, context={'request': request})
         if serializer.is_valid(raise_exception=True):
             serializer.save()
             return Response(serializer.data)

     def partial_update(self, request, pk=None):
         instance = get_object_or_404(PublicProfile, pk=pk)
         serializer = PublicProfileUpdateSerializer(instance, data=request.data, context={'request': request}, partial=True)
         if serializer.is_valid(raise_exception=True):
             serializer.save()
             return Response(serializer.data)

     def destroy(self, request, pk=None):
         instance = get_object_or_404(PublicProfile, pk=pk)
         instance.user.is_active = False
         instance.user.save()
         return Response(status=status.HTTP_200_OK)

1 Ответ

0 голосов
/ 10 мая 2018

Эти формы распространяются из стандартного не-JSON API-интерфейса Django Rest Framework по умолчанию, поскольку JSON-API указывает только тип носителя JSON.Но, возможно, стоит создать интерфейс JSON-API с возможностью просмотра, хотя я лично предпочитаю использовать Postman.

Посмотрите в настройках классов парсера и рендерера: REST_FRAMEWORK = { 'PAGE_SIZE': 10, 'EXCEPTION_HANDLER': 'rest_framework_json_api.exceptions.exception_handler', 'DEFAULT_PAGINATION_CLASS': 'rest_framework_json_api.pagination.PageNumberPagination', # 'DEFAULT_PAGINATION_CLASS': 'rest_framework_json_api.pagination.LimitOffsetPagination', 'DEFAULT_PARSER_CLASSES': ( 'rest_framework_json_api.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser', ), 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework_json_api.renderers.JSONRenderer', # application/vnd.api+json 'rest_framework.renderers.BrowsableAPIRenderer', # text/html: ?format=api ), 'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata', 'TEST_REQUEST_DEFAULT_FORMAT': 'vnd.api+json', 'TEST_REQUEST_RENDERER_CLASSES': ( 'rest_framework_json_api.renderers.JSONRenderer', 'rest_framework.renderers.MultiPartRenderer', 'rest_framework.renderers.TemplateHTMLRenderer' ), }

...