0

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.

1 Answers1

0

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']

ruddra
  • 50,746
  • 7
  • 78
  • 101
  • Request.FILES worked thank you very much you helped me), but can you tell me please the benefit of overriding method in serializer? – Davit Sahakyan Jan 04 '23 at 09:12
  • You are already doing it for password. Hence putting all the logic in the same place would be maintainable in future. – ruddra Jan 04 '23 at 09:14