Django Rest Framework ImageField

后端 未结 5 1792
旧巷少年郎
旧巷少年郎 2020-12-07 18:54

I can not save the image in this ImageField.

when sending data back:

{
    \"image\": [\"No file was submitted. Check the encoding t         


        
相关标签:
5条回答
  • 2020-12-07 19:18
    **
    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`**
    
    0 讨论(0)
  • 2020-12-07 19:21

    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.

    0 讨论(0)
  • 2020-12-07 19: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)
    
    0 讨论(0)
  • 2020-12-07 19:27

    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 讨论(0)
  • 2020-12-07 19:28

    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

    0 讨论(0)
提交回复
热议问题