I can not save the image in this ImageField.
when sending data back:
{ "image": ["No file was submitted. Check the encoding type on the form."] }
model.py
class MyPhoto(models.Model): owner = models.ForeignKey('auth.User', related_name='image') image = models.ImageField(upload_to='photos', max_length=254)
serializers.py
class PhotoSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = MyPhoto fields = ('url', 'id', 'image', 'owner') owner = serializers.Field(source='owner.username')
view.py
class PhotoList(APIView): permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly) def get(self, request, format=None): photo = MyPhoto.objects.all() serializer = PhotoSerializer(photo, many=True) return Response(data=serializer.data, status=status.HTTP_200_OK) def post(self, request, format=None): serializer = PhotoSerializer(data=request.DATA) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def pre_save(self, obj): obj.owner = self.request.user class PhotoDetail(APIView): permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly) def get_object(self, pk): try: return MyPhoto.objects.get(pk=pk) except MyPhoto.DoesNotExist: raise Http404 def get(self, request, pk, format=None): photo = self.get_object(pk) serializer = PhotoSerializer(photo) return Response(serializer.data) def put(self, request, pk, format=None): photo = self.get_object(pk) serializer = PhotoSerializer(photo, data=request.DATA) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk, format=None): photo = self.get_object(pk) photo.delete() return Response(status=status.HTTP_204_NO_CONTENT) def pre_save(self, obj): obj.owner = self.request.user
url.py
urlpatterns = patterns('', url(r'^$', 'main.views.main_page'), url(r'^api/photo/$', views.PhotoList.as_view(), name='myphoto-list'), url(r'^api/photo/(?P<pk>[0-9]+)/$', views.PhotoDetail.as_view(), name='myphoto-detail'),)
curl
curl -X POST -S \ -H 'Content-Type: application/json' \ -u "michael:bush_pass" \ --data-binary '{"owner":"/users/1/", \ "image":"/Users/test/Downloads/1383310998_05.jpg"}' \ 127.0.0.1:8000/api/photo/
Any 'read_only' fields that are incorrectly included in the serializer input will be ignored. Set this to True to ensure that the field is used when serializing a representation, but is not used when creating or updating an instance during deserialization.
I think you can use request.data
instead after django rest framework 3.0
. The usage of request.DATA
and request.FILES
is now pending deprecation in favor of a single request.data
attribute that contains all the parsed data.
You can check it from here
You seem to be missing the request.FILES
argument to the serializer constructor in the your post
and put
handlers.
serializer = PhotoSerializer(data=request.DATA, files=request.FILES)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With