简体   繁体   中英

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM