[TIL] 2022.10.26 Django User

xddongx-hyeon2·2022년 11월 13일

1. 진행 상황

  • User 모델 개발(AbstractUser)
  • User 회원가입, 수정, 삭제 API
  • User 생성, 관리자 페이지 에러

2. 진행 상황 리뷰

# users/models.py
from django.contrib.auth.base_user import BaseUserManager
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from django.db import models


class UserManager(BaseUserManager):
    """
    BaseUserManager : User를 생성할때 사용하는 클래스
    """

    def create_user(self, user_id, password, **extra_fields):
        """
        User 생성하는 함수
        """
        if not user_id:
            raise ValueError(_("The Email must be set"))
        user_id = self.normalize_email(user_id)
        user = self.model(user_id=user_id, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, user_id, password, **extra_fields):
        """
        관리자 User 생성하는 함수
        """
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_active", 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(user_id, password, **extra_fields)


class User(AbstractUser):
    """
    AbstractUser : 상속받아 생성하는 클래스
    """

    username = None
    first_name = None
    last_name = None
    user_id = models.CharField(max_length=20, unique=True, null=False, default=False)
    password = models.CharField(max_length=20, null=False, verbose_name="비밀번호")
    user_name = models.CharField(max_length=30, null=False, verbose_name="사용자 이름")
    address = models.CharField(max_length=100, blank=True, verbose_name="주소")

    objects = UserManager()

    USERNAME_FIELD = "user_id"
    REQUIRED_FIELDS = []
# users/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from users.models import User

class CustomUserAdmin(UserAdmin):
    model = User
    list_display = ['id', 'user_id', 'date_joined', 'is_active']
    list_display_links = ['id', 'user_id']
    ordering = ['date_joined',]
    fieldsets = [
        (None, {'fields': ['user_id', 'password', 'user_name', 'email', 'address',
                           'is_superuser', 'is_staff', 'is_active', 'user_permissions']}),
        ('Date information', {'fields': ['date_joined', 'last_login']})
    ]

admin.site.register(User, CustomUserAdmin)
  • User 모델 확장
  • BaseUserManager 재정의
  • admin display 필드 재정의

3. Today I Learned

User 모델 확장(AbstractUser 상속)

username을 user_id로 대체하고 싶어 username, first_name, last_name을 None으로 처리하였다. 이때부터 모든 에러의 시작이었다....

user 생성, super user 생성 에러

User와 superuser를 생성하는데 문제가 발생하였다. username을 찾을 수 없다... User를 생성할 때 사용하는 클래스인 BaseUserManager를 상속받아 재정의 해줘야 한다는 것을 알았다. username을 받던 변수, 파라미터 들을 user_id로 수정하여 user, superuser 생성을 해결할 수 있었다.

admin 페이지 에러

admin 페이지에서도 기준은 username이었다... ordering의 기준이 username이라 ordering을 바꿔 주었지만 다른 문제 발생 정의하지 않은 필드를 찾을 수 없다... 그래서 필드 전체를 내가 확장 정의한 필드들로 수정해 주었더니 해결 할 수 있었다.
교훈 잘 만들어진 건 건들지 말자.... 그냥 알아서 활용해서 쓰자...... 괜한 객기로 손해가 많다..... 다음엔 username을 가지고 만들어 봐야겠다.


참고자료

0개의 댓글