사용자 모델 만들기: models.py

전체 코드 내용

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


사용자 모델 만들기: models.py 1

새로운 사용자를 생성하는 사용자 모델 관리자 방식입니다.

이메일, 비밀번호, **extra_fields 매개변수를 허용합니다.

위에서 언급했듯이 extra_fields는 선택적으로 전달할 수 있는 일부 사용자 속성을 포함할 수 있는 사전입니다.

setdefault 함수를 사용하여 is_staff 및 is_superuser 속성을 기본값으로 설정합니다.

이들은 관리자 권한 또는 수퍼유저 권한입니다.

마지막으로 _create_user() 메서드를 호출하고 이메일, 비밀번호, **extra_fields 의 값을 전달합니다.

_create_user


사용자 모델 만들기: models.py 2

새 개체를 만들고 저장하는 UserManager 클래스의 메서드 중 하나입니다.

이메일과 비밀번호는 필수 인수이며 extra_fields는 선택적으로 전달할 수 있습니다.

이메일이 비어 있는지 확인하고 이메일을 소문자로 정규화합니다.

이메일 주소는 대소문자를 구분하지 않으므로 모두 소문자로 작성하여 혼동을 피하고 일관성을 유지할 수 있습니다.

email 및 extra_fields를 사용하여 사용자 모델의 새 인스턴스를 만듭니다.

set_password를 사용하여 암호화된 암호를 저장하고 데이터베이스에 저장합니다.

create_superuser


사용자 모델 만들기: models.py 3

슈퍼유저를 생성하는 Django의 User Model Manager 메소드. 이메일, 비밀번호 및 **extra_fields를 매개변수로 받습니다.

먼저 extra_fields 매개변수를 사용하여 관리자 및 수퍼유저 권한을 True로 설정합니다.

이는 super_user를 생성하는 메소드이므로 모두 true로 설정해야 합니다.

is_staff 또는 is_superuser가 False이면 ValueError가 발생하고 메시지가 표시됩니다.

마지막으로 이메일, 비밀번호, **extra_fields를 _create_user() 메서드에 전달합니다.

클래스 사용자


사용자 모델 만들기: models.py 4


사용자 모델 만들기: models.py 5

여기에는 이메일, 이름, is_employee, is_active 및 date_joined와 같은 필드가 포함되며 각각 이메일 주소, 이름, 직원 권한, 활성화 상태 및 가입 날짜가 표시됩니다.

objects 속성은 UserManager() 클래스의 인스턴스를 참조합니다.

– 모든 사용자 모델에서 요구하는 메서드를 구현하는 관리자.

USERNAME_FIELD는 사용자를 식별하는 필드입니다.

– 이메일로 본인 확인.

메타 클래스는 모델 클래스의 메타데이터를 지정합니다.

여기에서 모델 이름과 이름의 복수형을 설정하고 변수 AUTH_USER_MODEL을 사용하여 모델을 변경 가능한 사용자 모델로 표시합니다.

email_user는 이메일을 보내는 데 사용됩니다.

제목은 제목이고 메시지는 이메일의 본문입니다.

from_email은 보낸 사람의 이메일입니다.

**kwargs는 이메일을 보내는 데 사용되는 추가 매개변수를 전달합니다.

이 방법은 사용하기 쉬운 이메일 전송 기능을 제공합니다.