405 "Метод POST не разрешен" в структуре Django REST

Я новичок в структуре Django REST. Может кто-нибудь объяснить, почему я получаю такую ​​ошибку, если я делаю запрос POST для '/api/index/'

405 Method Not Allowed
{"detail":"Method \"POST\" not allowed."}

Мой код следующий:

# views.py
class ApiIndexView(APIView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request, format=None):
        return Response("ok")

# urls.py
urlpatterns = [
    url(r'^api/index/$', views.ApiIndexView.as_view()),
]

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.DjangoModelPermissions',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    )
}

Но если я добавлю <pk> в свой шаблон, все будет хорошо:

# views.py
class ApiIndexView(APIView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request, pk, format=None):
        return Response("ok")

# urls.py
urlpatterns = [
    url(r'^api/index/(?P<pk>\d+)/$', views.ApiIndexView.as_view()),
]

Я совершенно смущен. Зачем нужно использовать <pk> и есть ли способ избежать использования этого параметра в шаблоне URL?

Ответ 1

Вам нужно просто изменить:

# views.py
class ApiIndexView(UpdateView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request, format=None):
        return Response("ok")

Ответ 2

Убедитесь, что у вас "POST" в http_method_names. В качестве альтернативы вы можете написать это следующим образом:

def allowed_methods(self):
    """
    Return the list of allowed HTTP methods, uppercased.
    """
    self.http_method_names.append("post")
    return [method.upper() for method in self.http_method_names
            if hasattr(self, method)]

Ответ 3

class ApiIndexView(APIView) 

вместо этого, пожалуйста, import from rest_framework import generics и измените его на

class ApiIndexView(generics.ListCreateAPIView) 

Есть много общих взглядов. ListCreateAPIView используется для GET и POST, а CreateAPIView используется только для методов POST