Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

AngularJS + Django REST, как удалить объект из списка?

Добрый день! Подскажите, пожалуйста, как добавить удаление объекта из списка? В контроллере в js добавил функцию, которая выполняет $http.delete('someurl' + id, {'id': id}); Если я правильно понимаю, delete метод работает только для url вида .../номер, например, /someurl/1? Без номер в конце ругается, что такой метод NOT ALLOWED.
При использовании $http.delete('someurl' + id, {'id': id}); судя по консоли выполняется DELETE http://someurl/1 и выдается ошибка 404 NOT FOUND. Страницы http://someurl/1 у меня нет и она мне как таковая не нужна, необходимо лишь каким-то образом удалить указанный объект. Добавление работает: $http.put('someurl', {'id': id}). Правда, в этом случае выдает ошибку 200 BAD REQUEST, но объект добавляется.
В views.py:
class MyAPI(mixins.UpdateModelMixin, generics.ListCreateAPIView): model = MyModel
permission_classes = [ permissions.IsAuthenticated ]
def get_serializer_class(self): if self.request.method in ['PUT', 'POST']: return MySerializerBasic return MySerializer
def get_queryset(self): return self.model.objects.filter(myfield=self.request.myfield).order_by('myorder')
def create(self, request, *args, **kwargs): data = {'myfield': request.myfield.id, 'myorder': 100} 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 myorder, element in enumerate(request.data['mylist']): self.model.objects.filter( myfield=request.myfield, id=element).update( myorder=myorder ) print(request.data['mylist']) return Response(status=status.HTTP_200_OK)
Что и куда нужно добавить для удаления элемента?
Пытаюсь добавить
def delete(self, request, *args, **kwargs): id = request.data['id'] item = self.get_object(id) item.delete() print(request.data['id']) return Response(status=status.HTTP_200_OK)
Но ничего не происходит В urls есть
url(r'^someurl$', MyApi.as_view())
Обновление: Добавил в urls перед
url(r'^someurl$', MyApi.as_view())
строку
url(r'^someurl/(?P\d+)/', MyApi.as_view())
В контроллере для удаления вызываю
$http.delete('someurl/' + id + '/');
Выдает ошибку 404 NOT FOUND
Функция удаления сейчас выглядит вот так: def delete(self, request, pk, format=None): item = self.model.objects.get(pk=pk) item.delete() print(pk) return Response(status=status.HTTP_200_OK)
Возникли дополнительные вопросы: почему ошибка 404, что за параметр pk - у меня нет такого поля в модели (делал по примеру https://stackoverflow.com/questions/26445450/how-to-delete-an-object-using-django-rest-framework ) И как можно посмотреть вывод print(...)?


Ответ

Всего-то нужно было добавить один параметр в url шаблон в urls.py.
Итого:
В urls.py нужно добавить шаблон для страницы удаления, в конце должен быть .../номер/, иначе запрос DELETE не будет выполняться.
url(r'^someurl/(?P\d+)/', MyApi.as_view(), name='delete')
где name='delete' - это имя функции
Т.е. урл будет вида
...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
Всем спасибо за помощь!

Комментариев нет:

Отправить комментарий