Home > Enterprise >  ImageField gets None value after overriding create method
ImageField gets None value after overriding create method

Time:01-04

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.

CodePudding user response:

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

  • Related