#django #angularjs #django_rest_framework
В urls.py url(r'^someurl/(?P\d+)/', MyApi.as_view(), name='delete') где name='delete' - это имя функции Т.е. URL будет вида ...someurl/123/ В views.py def delete(self, request, pk, format=None): item = self.model.objects.get(pk=pk) item.delete() print(pk) return Response(status=status.HTTP_204_NO_CONTENT) В контроллере вызываю $http.delete('someurl/' + id + '/'); При таком запросе удалится объект с номером = id Но сейчас мне нужно удалить объект, не зная его id. Я знаю только значение поля image_url. Вызывать $http.delete('someurl/1/'); где 1 - это любое число, ни с чем не связанное, т.к. delete требует такого формата вызова; и передавать image_url в качестве дополнительного параметра в request? Таким образом: $http.delete('someurl/1/', {'image_url': 'какой-то урл'}); Есть ли более элегантное решение, чем приписывать магическое число в конце? Обновление: При использовании $http.delete('someurl/1/', {'image_url': 'какой-то урл'}); и в view.py def delete(self, request, pk, format=None): image_url = request.data['image_url'] item = self.model.objects.get(image_url=image_url) item.delete() return Response(status=status.HTTP_204_NO_CONTENT) Возникает ошибка 403. Обновление 2 class SortedItemsAPI(mixins.UpdateModelMixin, generics.ListCreateAPIView): model = SortedItem permission_classes = [ permissions.IsAuthenticated ] def get_serializer_class(self): if self.request.method in ['PUT', 'POST']: return SortedItemIdSerializerBasic return SortedItemSerializer def get_queryset(self): return self.model.objects.filter(user=self.request.user).order_by('order') def create(self, request, *args, **kwargs): data = {'user': request.user.id} data.update(request.data) serializer = self.get_serializer(data=data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) def put(self, request, *args, **kwargs): for order, element in enumerate(request.data['sorted']): self.model.objects.filter( user=request.user, id=element).update( order=order ) print(request.data['sorted']) return Response(status=status.HTTP_200_OK) def delete(self, request, pk, format=None): item = self.model.objects.get(item_id=pk) item.delete() return Response(status=status.HTTP_204_NO_CONTENT) Если меняю на def delete(self, request, pk, format=None): item = self.model.objects.get(item_id=request.GET['id']) item.delete() return Response(status=status.HTTP_204_NO_CONTENT) и, конечно, передаю в request.data параметр id, который в точности равен pk - возникает ошибка 500 INTERNAL SERVER ERROR.
Ответы
Ответ 1
Если вы используете rest_framework, то можно использовать декоратор @list_route @list_route(method=['delete']) def remove_image(self, request): image_url = request.data['image_url'] item = self.model.objects.get(image_url=image_url) item.delete() return Response(status=status.HTTP_204_NO_CONTENT)
Комментариев нет:
Отправить комментарий