Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Rest Framework ImageField

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/ 
like image 815
M.Hoffa Avatar asked Nov 30 '13 17:11

M.Hoffa


People also ask

What is Read_only true in Django?

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.


2 Answers

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

like image 132
Scofield77 Avatar answered Sep 20 '22 08:09

Scofield77


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) 
like image 37
Kevin Stone Avatar answered Sep 19 '22 08:09

Kevin Stone