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 모델이 완성된걸 볼수있다.