ошибка non_field_errors «Данные не предоставлены» при запросе PUT

#python #django #django-rest-framework

Вопрос:

Я новичок в Django и python. Теперь я пытаюсь создать веб-API с помощью Django и python. Мои запросы на ПОЛУЧЕНИЕ, публикацию и УДАЛЕНИЕ работают, но PUT выдает мне ошибку:

{ «non_field_errors»: [ «Данные не предоставлены» ] }

(я использовал почтальона)

Вот мой код:

Сериализатор:

 from rest_framework import serializers from .models import Topic class TopicSerializer(serializers.ModelSerializer):  title = serializers.CharField(max_length=50)  text = serializers.CharField(max_length=500)   class Meta:  model = Topic  fields = [  'title', 'text'  ]   def update(self, instance, validated_data):  instance.title = validated_data.get('title', instance.title)  instance.description = validated_data.get('text', instance.description)  instance.save()  return instance  

Число просмотров:

 from rest_framework.generics import get_object_or_404 from rest_framework.response import Response from rest_framework.views import APIView  from .models import Topic from .serializers import TopicSerializer  class TopicView(APIView):  def get(self, request):  topics = Topic.objects.all()  serializer = TopicSerializer(topics, many=True)  return Response({'topic': serializer.data})   def post(self, request):  topic = request.data   serializer = TopicSerializer(data=topic)  if serializer.is_valid(raise_exception=True):  topic_saved = serializer.save()  return Response({'success': 'Topic {} created successfully'.format(topic_saved.title)})   def put(self, request, pk):  # saved_topic = get_object_or_404(Topic.objects.all())  saved_topic = get_object_or_404(Topic.objects.filter(id=pk))  data = request.data.get('topic')  serializer = TopicSerializer(instance=saved_topic, data=data, partial=True)  if serializer.is_valid(raise_exception=True):  topic_saved = serializer.save()  return Response({  "success": "Topic '{}' updated successfully".format(topic_saved.title)  })   def delete(self, request, pk):  topic = get_object_or_404(Topic.objects.all(), pk=pk)  topic.delete()  return Response({  "message": "Topic with id `{}` has been deleted.".format(pk)  }, status=204)  

URL-адреса приложений:

 from django.urls import path from .views import TopicView  app_name = "rest_test_app" # app_name will help us do a reverse look-up latter. urlpatterns = [  path('topics/', TopicView.as_view()),  path('topics/lt;int:pkgt;', TopicView.as_view()) ]  

тело запроса:

 { "title": "pipiska", "text": "pipiska111" }  

это из-за использования неправильных методов? (извините за ужасный английский)

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

1. какой запрос вы отправляете? можете ли вы добавить это в вопрос?

2. я отправляю запрос на размещение

3. тело запроса ?

4. извини, забудь об этом

5. Вы должны перейти request.data к сериализатору, а не request.data.get('topic') . Почему такая очередь data = request.data.get('topic') ?

Ответ №1:

Два изменения и запрос на ввод будут работать нормально.

Один из них находится в serializers.py файл. Вместо instance.description = validated_data.get('text', instance.description) того, чтобы изменить его на instance.text = validated_data.get('text', instance.text)

Еще один, как упоминалось в комментариях, в views.py в положенном определении используйте data = request.data вместо data = request.data.get('topic')

Затем отправьте запрос от почтальона со следующим текстом запроса:

 { "title": "pipiska", "text": "pipiska111" }  

это будет работать нормально.

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

1. Спасибо за помощь, это сработало! это просто была моя неосторожность

2. С удовольствием. Счастливого кодирования.