Django Rest Framework ImageField
django, django-rest-framework, python
Solution
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)
Problem
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/ ```