dj_rest_auth registration custom user(account) 회원가입

728x90

삽질 기간: 3~4일

 

dj_rest_auth registration custom 등록 등 별의 별 검색어로 3~4일 동안 찾아보다가 구글에 있는 정보로 적용해보아도 안됨.

dj_rest_auth github 소스를 보고 직접 디버깅하여 구조 파악 후 어디서 필드 추가 되어 등록되는지 찾아보고 확인해서 써보는 글

dj-rest-auth 4.0.0 version

dj_rest_auth registration custom 

  • CustomRegisterSerializer 생성
from dj_rest_auth.registration.serializers import RegisterSerializer

class CustomRegisterSerializer(RegisterSerializer):
    add_field_1 = serializers.CharField()
		
		# RegisterSerializer에서 get_cleaned_data() 오버라이딩 해서 사용합니다.
    def get_cleaned_data(self):
				# RegisterSerializer의 get_cleaned_data()를 기본적으로 가져옵니다.
				# def get_cleaned_data(self):
        #return {
        #    'username': self.validated_data.get('username', ''),
        #    'password1': self.validated_data.get('password1', ''),
        #    'email': self.validated_data.get('email', ''),
        #}
        cleaned_data= super().get_cleaned_data()
				# 추가할 feild를 추가합니다.
        cleaned_data['add_field_1 '] = self.validated_data.get('add_field_1 ', '')
        return cleaned_data
  • CustomAccountAdapter 생성
from allauth.account.adapter import DefaultAccountAdapter
from allauth.account.utils import user_field

# DefaultAccountAdapter에서 save_user() 오버라이딩 해서 사용합니다.
class CustomAccountAdapter(DefaultAccountAdapter):

    def save_user(self, request, user, form, commit=False):
			  # DefaultAccountAdapter의 save_user()를 기본적으로 가져옵니다.
        user = super().save_user(request, user, form, commit)
				# 여기서 form 은 위에 CustomRegisterSerializer 입니다. cleaned_data를 가져옵니다.
        data = form.cleaned_data
				# utils 의 user_field를 사용해 user_field를 추가합니다.
        user_field(user, "add_field_1 ", data.get("add_field_1 "))
				# 저장
        user.save()
        return user

# DefaultAccountAdapter 에서 save_user() 의 기본구조
# def save_user(self, request, user, form, commit=True):
        """
        Saves a new `User` instance using information provided in the
        signup form.
        """
        # from .utils import user_email, user_field, user_username

        # data = form.cleaned_data
        # first_name = data.get("first_name")
        # last_name = data.get("last_name")
        # email = data.get("email")
        # username = data.get("username")
        # user_email(user, email)
        # user_username(user, username)
        # if first_name:
        #     user_field(user, "first_name", first_name)
        # if last_name:
        #     user_field(user, "last_name", last_name)
        # if "password1" in data:
        #     user.set_password(data["password1"])
        # else:
        #     user.set_unusable_password()
        # self.populate_username(request, user)
        # if commit:
            # Ability not to commit makes it easier to derive from
            # this adapter by adding
        #     user.save()
        # return user

# utils 의 user_field 
# def user_field(user, field, *args):
    """
    Gets or sets (optional) user model fields. No-op if fields do not exist.
    """
    # if not field:
    #     return
    # User = get_user_model()
    # try:
    #     field_meta = User._meta.get_field(field)
    #     max_length = field_meta.max_length
    # except FieldDoesNotExist:
    #     if not hasattr(user, field):
    #         return
    #     max_length = None
    # if args:
        # Setter
    #     v = args[0]
    #     if v:
    #         v = v[0:max_length]
    #     setattr(user, field, v)
    # else:
        # Getter
    #    return getattr(user, field)
  • Custom User Model 생성
from django.contrib.auth.models import AbstractUser
from .managers import UserManager

class User(AbstractUser):
    username = None
    email = models.EmailField(_('email address'), unique=True)
    add_field_1 = models.CharField(max_length=10, blank=True, null=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['add_field_1']

    objects = UserManager()

    def __str__(self):
        return self.email
  • Setting 등록
# CustomRegisterSerializer 등록
REST_AUTH = {
    'REGISTER_SERIALIZER': 'accounts.serializers.CustomRegisterSerializer',
}
# CustomAccountAdapter 등록
ACCOUNT_ADAPTER = 'accounts.adapter.CustomAccountAdapter'
# AUTH_USER_MODEL 등록
AUTH_USER_MODEL = 'accounts.User'
반응형