Search code examples
djangodjango-rest-frameworkimagefield

ImageField gets None value after overriding create method


I am trying to create a user, I need to override the create method, but after that, imagefield gets null value instead of given file here is my code

views.py

class VerifyEmail(CreateAPIView):
    serializer_class = UserSerializer
    queryset = User.objects.none()
    def create(self, request, *args, **kwargs):
        print(request.POST.get("profile_picture"))
        token = request.GET.get("token")
        invite_info = Invitation.objects.get(new_token=token)

        data = {
            'email': invite_info.receiver,
            'organization': invite_info.organization.pk,
            'is_staff': request.GET.get('is_staff', False),
            'is_superuser': request.GET.get('is_superuser', False),
            'first_name': request.POST.get('first_name', ''),
            'last_name': request.POST.get('last_name', ''),
            'profile_picture': request.POST.get('profile_picture'),
            'country': request.POST.get('country'),
            'password': request.POST.get('password')
        }
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        serializer.save()
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=201, headers=headers)

serilizers.py

# class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(
        write_only=True,
        required=True,
        style={'input_type': 'password', 'placeholder': 'Password'}
    )
    class Meta:
        model = User
        fields = ('id', 'email', 'organization', 'first_name', 'last_name',
                  'country', 'profile_picture',  'date_joined', 'modification_date', "is_active",'password')
    

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data.get('password'))
        return super(UserSerializer, self).create(validated_data)

imagefield in models.py

profile_picture = models.ImageField(upload_to="images",)

It's work fine when I use default implementation of create method,but when I try to override it dictionary data gets all values except "profile_picture" which gets None. please help me.


Solution

  • You should be able to get the file from request.FILES, not request.POST.

    But, rather than overriding the View's create function like that, why not override the serializer's create function like this:

    class ABCSerializer():
    
        password = serializers.CharField(
            write_only=True,
            required=True,
            style={'input_type': 'password', 'placeholder': 'Password'}
        )
        class Meta:
            model = User
            fields = ('id', 'email', 'organization', 'first_name', 'last_name',
                      'country', 'profile_picture',  'date_joined', 'modification_date', "is_active",'password')
        
    
        def create(self, validated_data):
            validated_data['password'] = make_password(validated_data.get('password'))
            request = self.context['request']
            token = request.GET.get("token")
            invite_info = Invitation.objects.get(new_token=token)
            validated_data['email'] = invite_info.receiver
            validated_data['organization'] = invite_info.organization.pk        return super(UserSerializer, self).create(validated_data)
    

    In this way, you can remove the override of create function from view.

    Finally, (optional) rather than using request.GET, why not pass the token information through URL argument ie path('/something/<token:str>', YourView.as_view()) and access that value through self.kwargs['token']