Добрый день! Подскажите, пожалуйста, как добавить удаление объекта из списка?
В контроллере в 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
В контроллере для удаления вызываю
$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
где 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
Всем спасибо за помощь!
Комментариев нет:
Отправить комментарий