[Django]-Django Rest Framework ImageField

26๐Ÿ‘

โœ…

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)

40๐Ÿ‘

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

10๐Ÿ‘

Uploading image files with Django Rest Framework:

models.py:

class MyPhoto(models.Model):
    name = models.CharField(max_length=255)
    image = models.ImageField(upload_to='myphoto/%Y/%m/%d/', null=True, max_length=255)

serializers.py:

class MyPhotoSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyPhoto
        fields = ('id', 'name', 'image')

views.py:

class PhotoList(APIView):
    def post(self, request, format=None):
        serializer = MyPhotoSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Hope it helps someone.

5๐Ÿ‘

Following should work if you are posting the image
as base64 string and your serializer set accordingly and it inherits serializer.Serializer

 # views.py 
import base64
import os
from django.core.files import File 

class PhotoList(APIView):
    def post(self,request,format=None):
        serializer = PhotoSerializer(data=request.data)
        if serializer.is_valid():
            # access the data as serializer.validated_data['keys']
            # save the MyPhoto obj lets call it myphoto
            # get the base64 string 
            imgstr64 = serializer.validated_data['corresponding filed in the serializer']
            imgdata = base64.b64decode(imgstr64)
            fname = '/tmp/%s.jpg'%(str(myphoto.id))
            with open(fname,'wb') as f:
                f.write(imgdata)
            imgname = '%s.jpg'%(str(myphoto.id))
            myphoto.image.save(imgname,File(open(fname,'r')))
            os.remove(fname)

0๐Ÿ‘

**
Django Rest Framework Image Upload
views.py
    class FileUploadView(APIView):
    permission_classes = []
    parser_class = (FileUploadParser,)

    @csrf_exempt
    def uploatuserprofile( request):

        #fetches specific user image
        if request.method=='GET':
            user_data=JSONParser().parse(request)
            obj=UserProfile.objects.filter(user=user_data["user"])
            serializer=UserProfileSerializer(obj,many=True)
            return JsonResponse(serializer.data,safe=False)



        if request.method == 'POST':
            # print('=====================================================================================>',request.FILES['profile_image'])
            
            # print("##################################################################################### ",request.POST['user'])
            try:
                s = UserProfile.objects.create(user_id = request.POST['user'], profile_image=request.FILES['profile_image'])
                s.save()
            except:
                return JsonResponse('Failed to upload Integrity error',safe=False)

            

            # file_serializer=UserProfileSerializer(request.POST,request.FILES)
        
            # if file_serializer.is_valid():
            #     file_serializer.save()
            return JsonResponse('profile uploded Sucessfully!!',safe=False)
        return JsonResponse('Failed to upload',safe=False)

urls.py of application

 url(r'^uploatuserprofile/$',views.FileUploadView.uploatuserprofile),


urls.py of project
from django.conf import settings
from django.conf.urls.static import static

from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^',include('ChatApp.urls'))
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

models.py

class UserProfile(models.Model):
    user = models.ForeignKey(Users,on_delete=models.CASCADE)
    profile_image = models.ImageField(upload_to='images/', blank=True, null=True)



    def __str__(self):
        return self.profile_image.name





setting.py

STATIC_URL = '/images/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "images"),

]
STATIC_DIR = os.path.join(BASE_DIR, 'images')
# Base url to serve media files
MEDIA_URL = '/media/'

# Path where media is stored
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')`enter code here`**

Leave a comment