метод put не работает с RetrieveUpdateDestroyAPIView Django Rest Framework Angular

Я пытаюсь сделать запрос на размещение в рамках django rest. Мое представление наследуется от класса RetrieveUpdateDestroyAPIView.

Я использую angular на переднем конце, django rest на заднем конце.

Вот ошибка:

Failed to load resource: the server responded with a status of 405 (Method Not Allowed)
ERROR 
detail:"Method "PUT" not allowed."

Вот полная реализация запроса на размещение со стороны angular на django rest.

editcity(index){
    this.oldcityname = this.cities[index].city;
     const payload = {
      citypk: this.cities[index].pk,
      cityname: this.editcityform.form.value.editcityinput
    };
     this.suitsettingsservice.editcity(payload, payload.citypk)
       .subscribe(
         (req: any)=>{
           this.cities[index].city = req.city;
           this.editcitysucess = true;
           // will have changed
           this.newcityname = this.cities[index].city;
         }
       );
  }

вызываемая служба

editcity(body, pk){
    const url = suitsettingscity + '/' + pk;
    return this.http.put(url, body);

URL-адрес, отображаемый на стороне django:

url(r'^city/(?P<pk>[0-9]+)',SearchCityDetail.as_view())

класс представления

class SearchCityDetail(RetrieveUpdateDestroyAPIView):
    queryset = SearchCity.objects.all()
    serializer_class = SearchCitySerializer

документация RetrieveUPdateDestoryAPIView:

http://www.django-rest-framework.org/api-guide/generic-views/#updatemodelmixin

RetrieveUpdateDestroyAPIView Используется для конечных точек чтения-записи-удаления для представления одного экземпляра модели.

Предоставляет обработчики методов get, put, patch и delete.

Расширяет: GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin.

Исходный код RetrieveUpdateDestroyAPIView:

class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
                                   mixins.UpdateModelMixin,
                                   mixins.DestroyModelMixin,
                                   GenericAPIView):
    """
    Concrete view for retrieving, updating or deleting a model instance.
    """
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

person amazing carrot soup    schedule 01.03.2018    source источник
comment
Возможно, у вас конфликтующий шаблон URL, и запрос не обрабатывается SearchCityDetail.   -  person Alasdair    schedule 02.03.2018
comment
@Alasdair, это хорошая мысль, я посмотрю на это   -  person amazing carrot soup    schedule 02.03.2018
comment
@Alasdair, так что эти два шаблона URL-адресов были противоположны тому, где они сейчас. Я получаю сообщение об отказе в соединении, но я исправлю это, и я думаю, что у нас может быть все хорошо url(r'city/(?P<pk>[0-9]+)/$',SearchCityDetail.as_view()) # detele put get url url(r'city', SearchCityListCreate.as_view()), # create city list url   -  person amazing carrot soup    schedule 02.03.2018
comment
@Alasdair Я люблю тебя. Это сработало   -  person amazing carrot soup    schedule 02.03.2018


Ответы (3)


Ваш шаблон URL для SearchCityListCreate совпадал с /city/x/, поэтому ваш запрос обрабатывался неправильным представлением.

Вы устранили проблему, изменив порядок, но лучшее решение — убедиться, что ваши регулярные выражения имеют ^ и $ для обозначения начала и конца URL-адреса соответственно.

url(r'^city$', SearchCityListCreate.as_view()),
url(r'^city/(?P<pk>[0-9]+)$',SearchCityDetail.as_view()),
person Alasdair    schedule 01.03.2018
comment
спасибо @Alasdair, я внесу эти изменения прямо сейчас - person amazing carrot soup; 02.03.2018

Вы можете реализовать его с помощью представления класса rest_framework `class country_detail (APIView): def get_object (self, pk): try: return CountryModel.objects.get (pk = pk), кроме CountryModel.DoesNotExist: поднять Http404

def get(self,request,pk,format=None):
    country=self.get_object(pk)
    serializer=CountrySerializer(country)
    return Response(serializer.data,status=status.HTTP_200_OK)
def put(self,request,pk,format=None):
    country=self.get_object(pk)
    serializer=CountrySerializer(country,data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data,status=status.HTTP_200_OK)
    return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
def delete(self,request,pk,format=None):
    country=self.get_object(pk)
    country.delete()` 
person Sanjeev kumar    schedule 13.09.2018

Мне нужно было изменить порядок URL-адресов моих городов

как бы то ни было, адрес города с ПК так и не был взят.

Плохой:

url(r'city', SearchCityListCreate.as_view()), # create city list url
url(r'city/(?P<pk>[0-9]+)/$',SearchCityDetail.as_view()), 

хорошо:

 url(r'city/(?P<pk>[0-9]+)/$',SearchCityDetail.as_view()), 
 url(r'city', SearchCityListCreate.as_view()), # create city list url
person amazing carrot soup    schedule 01.03.2018