개인 포트폴리오로 쇼핑몰을 만들기로 했다.
앞으로 그날 그날 작업한 이력과 새로 알게된 점들을 글로 남기고자 이 시리즈를 시작한다.
1. 전반적인 쇼핑몰의 ERD를 그렸다.
DB의 구조를 시각화하여 개발하는데 이해를 돕고자,
나중에 포트폴리오 자료에 첨부하려고 그렸다.
ERD를 그리는데 추가적인 소프트웨어를 설치하고 싶지 않아서
웹으로 그릴 수 있는 ERDCloud를 사용했다.
2. Project를 생성했고, account app을 생성했다.
개인적으로 무언가 이름을 짓는걸 꽤 어려워한다. (게임 캐릭터 이름같은...)
아무튼, 쇼핑몰 이름은 STREET99이 될거다. 요즘 브루클린 나인나인을 보니까
3. accountapp의 models.py와 admin.py를 작성했다.
AbstractBaseUser와 BaseUserManager를 상속받아 클래스 메소드를 오버라이딩 하여
커스터마이징을 했다.
이렇게 커스터마이징한 User 모델을 사용하기위해 settings.py에 설정값을 넣어줬고
admin.py에 UserAdmin을 상속받아 화면을 커스터마이징 하였다.
여기를 보며 작업했다.
BaseUserManager를 상속받는 UserManager 클래스를 정의하며...
AbstractBaseUser를 상속받는 User모델에서 내가 추가한 필드들(전화번호, 생년월일)을
UserManager의 create_user()와 create_superuser()에 넘겨주는데 막혔었다.
기존에 내가 만들던 Model들은 단순히 email, username, password가 전부였으니까.
문제:
terminal에서 createsuperuser 명령어를 통해 어드민 계정을 생성하는데
email, username은 잘 받다가 갑자기 date_of_birth라는 내가 user model에 추가한 field가
'NOT NULL constraint failed'를 발생하며 명령어가 취소되었다.
def create_user(self, email, username, password, **extra_fields):
def create_superuser(self, email, username, password, **extra_fields):
와 같이 파라미터로 내가 User Model에서 추가한 fields들을 넘겨주었고
create_superuser()의 경우 extra_fields.setdefault()를 통해 default값을 직접 지정하여 해결했다.
models.py
class UserManager(BaseUserManager):
def create_user(self, email, username, password, **extra_fields):
.
.
.
user = self.model(
email = self.normalize_email(email),
username = username,
**extra_fields
)
.
.
.
def create_superuser(self, email, username, password, **extra_fields):
extra_fields.setdefault('phone_number', '00000000000')
extra_fields.setdefault('date_of_birth', '1900-01-01')
user = self.create_user(
email = self.normalize_email(email),
username = username,
password = password,
**extra_fields
)
.
.
.
class User(AbstractBaseUser):
objects = UserManager()
email = models.EmailField(max_length=60, unique=True)
username = models.CharField(max_length=20, unique=True)
phone_number = models.CharField(max_length=20)
date_of_birth = models.DateField(max_length=8)
created_at = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
.
.
.