# 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)
username을 user_id로 대체하고 싶어 username, first_name, last_name을 None으로 처리하였다. 이때부터 모든 에러의 시작이었다....
User와 superuser를 생성하는데 문제가 발생하였다. username을 찾을 수 없다... User를 생성할 때 사용하는 클래스인 BaseUserManager를 상속받아 재정의 해줘야 한다는 것을 알았다. username을 받던 변수, 파라미터 들을 user_id로 수정하여 user, superuser 생성을 해결할 수 있었다.
admin 페이지에서도 기준은 username이었다... ordering의 기준이 username이라 ordering을 바꿔 주었지만 다른 문제 발생 정의하지 않은 필드를 찾을 수 없다... 그래서 필드 전체를 내가 확장 정의한 필드들로 수정해 주었더니 해결 할 수 있었다.
교훈 잘 만들어진 건 건들지 말자.... 그냥 알아서 활용해서 쓰자...... 괜한 객기로 손해가 많다..... 다음엔 username을 가지고 만들어 봐야겠다.
참고자료