장고문서에 따르면 built-in user보다 커스텀 유저모델을 생성하길 강조하고 있다. 차후에 성별 혹은 나이 등의 필드가 추가될 때 확장성
이 커스텀 모델보다 어렵기 때문이다.
커스텀 유저 모델을 AbstractUser
라고도 하는데,
유저 모델을 생성해보자.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users.apps.UsersConfig',
'comments.apps.CommentsConfig',
]
AUTH_USER_MODEL = 'users.CustomUser'
위와 같이 프로젝트 내 생성한 앱에 대한 환경설정을 하였다.
built-in 유저가 아닌, 커스텀 유저 모델을 사용하기 위한 셋팅이다.
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
age = models.PositiveIntegerField(null=True, blank=True)
null값은 데이터베이스
와 관련 있는 속성값이다.
모델기반으로 DB에 테이블이 생성될텐데,
'값 없음'을 허용할 것인지를 묻는 것이다.
C언어에서도 void
및 null
의 개념이 있다.
'값이 존재하지 않는 상태'
즉, 비어있는 상태를 명시적으로 언급하는 것이다.
값이 없다의 개념이다.(값이 zero 라는 의미가 아니다.)
만약 임의의 필드에 해당하는 어떤 값 하나가 들어오지 않았는데,
null = True일 경우, 데이터베이스는 그 엔트리를 NUll로 입력한다.
blank=True와 blank=False는
데이터베이스와 연관이 사실 없는 개념이다.
회원가입을 할 때,
자기소개란을 반드시 채워야 하면, blank=False를
자기소개란을 채우지 않아도 된다면, blank=True로 정한다.
데이터베이스에 값이 저장되기 전 모델링 단계에서 결정하고 판단해야 한다.
그렇다면 blank와 null 관련한 에러는 왜 발생하는 것일까
기본적으로 default는 둘 모두 False다.
이 부분을 놓치는 경우가 있다.
따라서, 대표적으로 TextField, CharField 등 문자(열)을 입력하는 필드들에 대해서는 null=True, blank=True
를 동시에 사용할 수 없다.
데이터베이스에 null값을 넣는 것보다 ''
공백을 넣는 것이 낫다고 한다. null=False, blank=True
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta:
model : CustomUser
fields = UserCreationForm.Meta.fields + ('age',)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model : CustomUser
fields : UserChangeForm.Meta.fields
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from.forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
admin.site.register(CustomUser, CustomUserAdmin)