회원가입 시 프로필 이미지를 등록해주는데 유저 모델에는 이미지 필드가 없습니다. (참고 : 미디어 파일 저장 경로)
그래서 회원가입 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 객체를 생성합니다.