DRF 3-6 Custom User

Grace Goh·2022년 11월 1일
0

Django Rest Framework

목록 보기
11/36
  1. jwt 기능을 완성하기 전에, custom user를 만든다. 유동적으로 만들기 위해. dj 공식문서 참고하여. 자율성이 높은 방식

username 외에 이메일 등으로 로그인도 가능해짐.
필요한 필드 추가 가능.

BaseUserManager

Manager 클래스가 생긴다.
helper 클래스

dj 공식 문서. 내용이 많은데 꼭 읽어보는 것을 추천.
https://docs.djangoproject.com/en/4.1/topics/auth/customizing/
A Full Example

# settings.py
AUTH_USER_MODEL = 'users.User'

DB를 삭제한다.
models.py에서 date_of_birth 관련 항목을 모두 삭제한다.

# models.py

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)


class UserManager(BaseUserManager):
    def create_user(self, email, password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """
        user = self.create_user(
            email,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user


class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [] # 빈 리스트로 둔다.

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

model을 변경하였기 때문에
makemigrations, migrate를 해준다.

user를 만든 후에는 테스트를 해본다.
모델을 만들고 모델이 제대로 작성되었는지 확인해보려면 admin을 만들어본다.

ABstractBaseUser에서 User를 만들 때는 BaseUserManager도 만들어야 한다.
is_staff(self), has_perm(self, perm, obj=None) 등도 필수사항이다.

profile
Español, Inglés, Coreano y Python

0개의 댓글