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