[4th TeamProject] - 회원가입

장현웅·2023년 10월 22일
0

회원가입 시 프로필 이미지를 등록해주는데 유저 모델에는 이미지 필드가 없습니다. (참고 : 미디어 파일 저장 경로)

그래서 회원가입 View와 Serializer에서도 프로필 이미지에 대한 작업이 필요합니다. 더해서, context에 대해 살짝만 적어보도록 하겠습니다.

[ 회원가입 뷰 ]

class RegisterView(APIView):
    def post(self, request):
        """사용자 정보를 받아 회원가입 합니다."""
        serializer = UserSerializer(data=request.data, context={'profile_img':request.FILES})
        print(request.FILES)
        if serializer.is_valid():
            user = serializer.save()
            return Response({'message':'회원가입 성공'}, status=status.HTTP_201_CREATED)
        else:
            return Response({'message': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

DRF의 Serializer는 데이터 유효성 검사를 할 때, 주로 Serializer 인스턴스의 data 매개변수를 기반으로 합니다.

is_valid 메서드는 data에 포함된 데이터가 Serializer의 필드 및 필드 유효성 감사 규칙과 일치하는지 확인합니다.

일부 몇몇 경우에는 data매개변수 이외의 다른 인자를 전달하더라도 is_valid() 유효성 검사를 통과할 수 있습니다. 이러한 경우 중 하나는 context 매개변수를 사용하는 경우입니다.

context 매개변수는 Serializer 클래스 내에서 사용자 정의 로직 또는 Serializer의 메서드에 필요한 추가 데이터를 전달하는 데 사용됩니다. 이러한 데이터는 Serializer의 유효성 검사와 직접적으로 관련되지 않기 때문에 is_valid() 유효성 검사에 영향을 주지 않습니다.

[ UserSerializer ]

class UserSerializer(serializers.ModelSerializer):
    """회원가입 페이지, 회원 정보 수정 페이지에서 사용되는 시리얼라이저입니다."""

    email = serializers.EmailField(required=True, validators=[UniqueValidator])

    nickname = serializers.CharField(required=True, validators=[UniqueValidator])

    password = serializers.CharField(write_only=True, required=True, validators=[validate_password])
    
    class Meta:
        model = User
        fields = "__all__"

    def create(self, validated_data):
        # user = super().create(validated_data)
        password=validated_data.pop('password')
        user = User(**validated_data)
        user.set_password(password)
        user.save()

        if self.context['profile_img']:
            profile_img = self.context['profile_img']
            image_data=profile_img.get('profile_img')
            ProfileImage.objects.create(owner=user, profile_img=image_data)
            return user
        else:
            profile_img = settings.DEFAULT_PROFILE_IMAGE
            ProfileImage.objects.create(owner=user, profile_img=profile_img)
            return user

위 Serializer는 사용자가 프로필 이미지를 등록했을 경우 그 이미지로 ProfileImage 객체를 생성하고 등록하지 않은 경우에는 settings.py에 정의한 Default 이미지 URL로 ProfileImage 객체를 생성합니다.

0개의 댓글