0

I have a front end where the user can create a 'Post' with or without an image. If the request is done without an image the 'Post' object gets created and there's no problem with it. But when I try to add the image in the post request by using Axios and FormData when Django receives this object my Serializer returns false for is_valid() function call...

An example post object contains the following keys:

{'text':'some string', 'image': {some_file_object(optional)}}

Here's my view:

class PostView(APIView):
permission_classes = (IsAuthenticated,)
parser_class = (MultiPartParser)

def post(self, request):
    user = User.objects.get(username=self.request.user)
    userSerialize = UserGetSerializer(user, partial=True)
    _mutable = request.data.copy()
    _mutable['user'] = userSerialize.data
    print(_mutable)
    serializer = PostSerializer(data=_mutable)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(status=status.HTTP_400_BAD_REQUEST)

Here's my serializer

class PostSerializer (serializers.ModelSerializer):
text = serializers.CharField(max_length=500, required=True)
user = UserSerializer(many=False)
likes = serializers.SerializerMethodField(read_only=True)
image = serializers.ImageField(required=False)

class Meta:
    model = Post
    fields = ('__all__')

def get_likes(self, obj):
    likes = obj.like_set.filter(post=obj.id)
    return LikeSerializer(likes, many=True).data

Here's my Model:

class Post(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="user",
                         on_delete=models.CASCADE, blank=True)
text = models.TextField(max_length=500)
date_posted = models.DateTimeField(auto_now_add=True)
hidden = models.BooleanField(default=False)
date_hidden = models.DateTimeField(blank=True, null=True)
hidden_by = models.ForeignKey(
    settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True, related_name='hidden_by')
image = VersatileImageField(
    upload_to='post_images/', ppoi_field='image_ppoi', blank=True, null=True)
image_ppoi = PPOIField()

def __str__(self) -> str:
    return self.text
Orçun Güler
  • 118
  • 1
  • 6

1 Answers1

0

Make sure you added the right content-type in the header of the request

Refer to the answer to send a file using Axios How to post a file from a form with Axios

Aanand S
  • 53
  • 7