Django 1.11 get () отсутствует 1 обязательный позиционный аргумент: 'pk' - PullRequest
0 голосов
/ 24 января 2019

Я использую Django 1.11, и у меня проблема с параметрами пути. Я получаю такую ​​ошибку для всех запросов, связанных с параметрами пути.

Error:
TypeError at /posts/2
get() missing 1 required positional argument: 'pk'

urls.py
...
url(r'^posts',PostView.as_view()),
url(r'^posts/<int:pk>/',PostView.as_view()),
...

views.py
..
#-------- API for CRUD -----------------#
class PostView(APIView):
    permission_classes = (IsAuthenticated,)

    def get_object(self,pk,user_id):
        try:
            return Post.objects.get(pk=pk,user_id=user_id)
        except Post.DoesNotExist:
            raise Http404

    def get(self,request,pk):
        post = Post.objects.get(user=request.user.id)
        serializer = PostSerializer(post)
        return Response({"success":True,"data":serializer.data},status=status.HTTP_200_OK)

    def put(self, request, pk):
        post = self.get_object(pk,request.user.id)
        serializer = PostSerializer(post, data=request.data)
        if serializer.is_valid():
            serializer.save(user=request.user.id)
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def post(self,request):
        params = request.data
        params['user'] = request.user.id
        serializer = PostSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        saved_data = self.perform_create(serializer)
        post = PostSerializer(saved_data)
        return Response({"success":True, "message":"Post  Added Successfully","data":post.data}, status=status.HTTP_201_CREATED)

    def perform_create(self, serializer):
        return serializer.save()
...

Пример URL:

GET : localhost:8000/posts/2

Может кто-нибудь сказать мне, как передать позиционные параметры.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

В приведенном выше коде вы используете user_id, pk в качестве позиционных аргументов в методах запроса и метода просмотра get_object.pk и user_id доступны для просмотра.Вы можете использовать их как self.kwargs.get('pk'), self.request.user.pk.Пожалуйста, проверьте код ниже для деталей реализации.

class PostView(APIView):
    permission_classes = (IsAuthenticated,)

    def get_object(self):
        pk = self.kwargs.get('pk')
        user_id = self.request.id
        try:
           return Post.objects.get(pk=pk,user_id=user_id)
        except Post.DoesNotExist:
           raise Http404

    def get(self,request, *args, **kwargs):
        # ...
        pass

    def put(self, request, *args, **kwargs):
        # ...
        pass

    def post(self,request, *args, **kwargs):
        # ...
        pass
0 голосов
/ 24 января 2019

Ваши get и post подписи принимают только параметры self и request, тогда как они должны включать параметр pk вашего URL.Поскольку вы определили одно и то же представление для URL без параметра pk, вы должны сделать эти параметры необязательными (поэтому добавьте значение по умолчанию, если они отсутствуют).Например:

class PostView(APIView):
    permission_classes = (IsAuthenticated,)

    def get_object(self,pk,user_id):
        # ...
        pass

    def get(self,request<b>, pk=None</b>):
        # ...
        pass

    def put(self, request, pk<b>=None</b>):
        # ...
        pass

    def post(self,request<b>, pk=None</b>):
        # ...
        pass

Альтернативой является предоставление kwargs в URL с отсутствующим параметром, например:

<b>path</b>(r'posts',PostView.as_view()<b>, kwargs={'pk': None}</b>),
<b>path</b>(r'posts/<int:pk>/',PostView.as_view())

или для pre- установки, вы должны определить это как регулярное выражение:

<b>url</b>(r'^posts/$',PostView.as_view()<b>, kwargs={'pk': None}</b>),
<b>url</b>(r'^posts/<b>(?P<pk>[0-9]+)</b>/',PostView.as_view())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...