Ответ 1
Вам нужно просто изменить:
# views.py
class ApiIndexView(UpdateView):
permission_classes = (permissions.AllowAny,)
def post(self, request, format=None):
return Response("ok")
Я новичок в структуре 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?
Вам нужно просто изменить:
# views.py
class ApiIndexView(UpdateView):
permission_classes = (permissions.AllowAny,)
def post(self, request, format=None):
return Response("ok")
Убедитесь, что у вас "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)]
class ApiIndexView(APIView)
вместо этого, пожалуйста, import from rest_framework import generics
и измените его на
class ApiIndexView(generics.ListCreateAPIView)
Есть много общих взглядов. ListCreateAPIView
используется для GET и POST, а CreateAPIView
используется только для методов POST