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/
You seem to be missing the
request.FILES
argument to the serializer constructor in the yourpost
andput
handlers.Uploading image files with Django Rest Framework:
models.py:
serializers.py:
views.py:
Hope it helps someone.
I think you can use
request.data
instead afterdjango rest framework 3.0
. The usage ofrequest.DATA
andrequest.FILES
is now pending deprecation in favor of a singlerequest.data
attribute that contains all the parsed data.You can check it from here
Following should work if you are posting the image as base64 string and your serializer set accordingly and it inherits serializer.Serializer