전체 코드 내용
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin
from django.core.mail import send_mail
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
class UserManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
if not email:
raise ValueError('이메일을 설정해야 합니다')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **extra_fields)
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True, blank=False)
name = models.CharField(_('name'), max_length=30, blank=False)
is_staff = models.BooleanField(_('staff status'), default=False, help_text=_('Designates whether the user can log into this admin site.'),)
is_active = models.BooleanField(_('active'), default=False, help_text=_('Designates whether this user should be treated as active. ' 'Unselect this instead of deleting accounts.'),)
date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
objects = UserManager()
USERNAME_FIELD = 'email'
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
swappable = 'AUTH_USER_MODEL'
def email_user(self, subject, message, from_email=None, **kwargs):
"""
Sends an email to this User.
"""
send_mail(subject, message, from_email, [self.email], **kwargs)
코드 해석
create_user
새로운 사용자를 생성하는 User모델 매니저의 메서드입니다. email, password,**extra_fields 매개변수를 받습니다.
extra_fields는 위에서도 이야기했듯 선택적으로 전달할수 있는 어려 사용자 속성을 포함할 수 있는 딕셔너리입니다.
setdefault 함수를 이용하여 is_staff와 is_superuser의 속성을 기본값으로 설정합니다. 각각 관리자 권한과 슈퍼유저 권한입니다.
마지막으로 _create_user() 메서드를 호출하고 email,password,**extra_fields 의 값들을 전달합니다.
_create_user
UserManager클래스의 매서드 중 하나로 새로운 객체를 생성하고 저장하는 기능을 합니다.
email과 password는 필수적 인자이며 extra_fields는 선택적으로 전달될 수 있습니다.
email이 비어 있는지 확인하고 이메일을 소문자로 정규화합니다. 이메일 주소는 대소문자를 구문 하지 않기 때문에 모두 소문자로 만들어 혼란을 줄이고 일관성을 유지할 수 있습니다.
email과 extra_fields를 사용하여 User모델의 새로운 인스턴스를 만듭니다.
set_password를 사용하여 암호화된 비밀번호를 저장하고 save를 통해 데이터 베이스에 저장합니다.
create_superuser
superuser를 생성하는 Django의 User모델 매니저의 메서드입니다. email, password, **extra_fields를 매개변수로 받습니다.
우선적으로 extra_fields 매개변수를 사용해서 관리자권한과 슈퍼유저 권한을 True로 설정합니다. super_user를 생성하는 매서드이기 때문에 당연하 모두 True로 설정해야 합니다.
만약 is_staff나 is_superuser가 False일 경우 ValueError가 발생하며 메시지가 출력됩니다.
마지막으로 _create_user() 메서드로 email, password,**extra_fields를 전달해 줍니다.
class User
email, name, is_staff, is_active, date_joinde 등의 필드를 가지고 있고 각각 이메일주소, 이름, 스태프권한, 활성화상태, 가입일자를 나타납니다.
objects속성은 UserManager() 클래스의 인스턴스를 참조하고 있습니다. - 모든 사용자 모델에 필요한 메서드를 구현하는 매니저입니다.
USERNAME_FIELD는 사용자를 식별하는 필드입니다. - email로 식별하고 있습니다.
Meta 클래스는 모델 클래스의 메타데이터를 지정합니다. 여기서는 모델의 이름과 이름의 복수형을 설정하고 AUTH_USER_MODEL변수를 사용하여 모델을 변경가능한 유저 모델로 지정합니다.
email_user은 이메일을 보내는 데 사용됩니다. subject는 제목, message는 내용으로 이메일을 보냅니다. from_email은 보내는사람의 이메일입니다. **kwargs는 이메일을 보내는데 사용되는 추가 매개변수를 전달합니다. 이 메서드는 이메일 송신기능을 간편하게 사용할 수 있도록 제공합니다.
추가 설정 / settings.py
현재 기본 user모델이 장고에서 제공하는 user모델로 설정되어 있기때문에 settings.py에서 아래의 코드를 넣어줘야 마이그레이트 했을때 원하는 db값이 나옵니다.
AUTH_USER_MODEL = '앱이름.모델이름r'
------ 예시 -------
AUTH_USER_MODEL = 'user.User'
'BackEnd > Django, DRF' 카테고리의 다른 글
Django - environ을 이용한 환경 변수 관리 (0) | 2023.04.18 |
---|---|
login - logout 기능 구현 (0) | 2023.03.21 |
HTML에서 보낸 데이터 어드민 사이트에서 수락 거절 기능 (0) | 2023.02.23 |
QuerySet의 값들을 쿠키에 저장하기 (0) | 2023.02.23 |
[Django] render 와 redirect 의 차이점과 사용법 (0) | 2023.02.23 |