User를 Customizing 해서 회원가입,로그인 구현하기!

김용녀·2022년 8월 11일
1

Django에서 admin 사이트에 들어가면 User라는 모델이 회원가입이나 로그인 할 경우 사용되는 기본 값이다.
django/contrib/auth/models.py 에 들어가면 확인할 수 있다.

class User(AbstractUser):
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

우리는 AbstractUser와 AbstractBaseUser를 이용할것인데,
둘의 차이점은
AbstractUser 는 localhots:8000/admin에서 User를 만들때,
기본적으로 제공하는 id / password / last_login / is_superuser / username / first_name / last_name / email / is_staff / is_active / date_joined 필드를 갖는다

반면 AbstractBaseUser는 id / password / last_login 세 가지 필드를 가진다 . 중요한 차이점은 AbstracBaseUser는 이 세 필드 외에 본인이 필드를 추가해서 사용 가능하다는 것이다.

이제 AbstracBaseUser를 상속받아 나만의 User모델을 만들어보자.


class Member(AbstractBaseUser):
    account_id = models.CharField(primary_key=True,max_length=15, null=False, blank=False, unique=True)
    email = models.EmailField(default='', max_length=100, null=False, blank=False, unique=True)
    nickname = models.CharField(default='', max_length=100, unique=True)
    name = models.CharField(default='', max_length=100)
    phone_number = models.CharField(max_length=15 )

    # User 모델의 필수 field
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    # 헬퍼 클래스 사용
    objects = UserManager()


    USERNAME_FIELD = 'account_id'
    # superuser만들때도 필수로 작성해야하는 field, 일반유저도 o
    REQUIRED_FIELDS = ['email','nickname','name','phone_number']

    def __str__(self):
        return self.account_id

//아래 함수는 작성하지 않을경우 admin페이지에서 오류가 발생가능하다.
    @property
    def is_staff(self):
        return self.is_admin
    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

모델을 작성했다. 이제 이 모델이 생성될때 어떤 동작을 할지 명시해야한다.

class UserManager(BaseUserManager):

    def create_user(self, account_id, email, nickname, name, phone_number, password=None):

        if not account_id:
            raise ValueError('must have user ID')
        user = self.model(
            account_id=account_id,
            email=self.normalize_email(email),
            nickname=nickname,
            name=name,
            phone_number = phone_number,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

#슈퍼유저

    def create_superuser(self, account_id,email, nickname, name,phone_number, password):
        user = self.create_user(
            account_id=account_id,
            email= email,
            password=password,
            nickname=nickname,
            name=name,
            phone_number=phone_number,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

이 때 작성해야하는것이 위 User내장 클래스에 정의된 'AUTH_USER_MODEL'을
프로젝트 settings.py로 가져와 AUTH_USER_MODEL = '앱이름.모델이름' 을 작성해줘야한다.

AUTH_USER_MODEL = 'account.Member'

admin페이지에서 User대신 나만의 custom 모델이 완성된걸 볼수있다.

profile
어서오세요

0개의 댓글