장고 - 커스텀 유저 모델 생성

hyuckhoon.ko·2020년 6월 16일
0

What I learned in wecode

목록 보기
54/109

장고문서에 따르면 built-in user보다 커스텀 유저모델을 생성하길 강조하고 있다. 차후에 성별 혹은 나이 등의 필드가 추가될 때 확장성이 커스텀 모델보다 어렵기 때문이다.

커스텀 유저 모델을 AbstractUser라고도 하는데,
유저 모델을 생성해보자.


1. settings.py 수정

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 유저가 아닌, 커스텀 유저 모델을 사용하기 위한 셋팅이다.



2. models.py 수정

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    age = models.PositiveIntegerField(null=True, blank=True)

잠시 짚고 넘어가야할 개념이 있다.

1) null=True, null=False

null값은 데이터베이스와 관련 있는 속성값이다.

모델기반으로 DB에 테이블이 생성될텐데,
'값 없음'을 허용할 것인지를 묻는 것이다.
C언어에서도 voidnull의 개념이 있다.

'값이 존재하지 않는 상태'
즉, 비어있는 상태를 명시적으로 언급하는 것이다.
값이 없다의 개념이다.(값이 zero 라는 의미가 아니다.)

만약 임의의 필드에 해당하는 어떤 값 하나가 들어오지 않았는데,
null = True일 경우, 데이터베이스는 그 엔트리를 NUll로 입력한다.



2) blank=True, black=False

blank=True와 blank=False는
데이터베이스와 연관이 사실 없는 개념이다.

회원가입을 할 때,
자기소개란을 반드시 채워야 하면, blank=False를
자기소개란을 채우지 않아도 된다면, blank=True로 정한다.

데이터베이스에 값이 저장되기 전 모델링 단계에서 결정하고 판단해야 한다.


그렇다면 blank와 null 관련한 에러는 왜 발생하는 것일까

기본적으로 default는 둘 모두 False다.

이 부분을 놓치는 경우가 있다.


또한, 데이터베이스와 앱 로직 단계를 구분하지 못해 발생하는 경우다. DB에 해당 값은 null=True인데, 그 데이터와 관련하여 ``is_valid()``와 같은 유효성 검증을 진행하면 문제가 되기 때문이다.

따라서, 대표적으로 TextField, CharField 등 문자(열)을 입력하는 필드들에 대해서는 null=True, blank=True를 동시에 사용할 수 없다.

데이터베이스에 null값을 넣는 것보다 ''공백을 넣는 것이 낫다고 한다. null=False, blank=True





3. forms.py 수정

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


4. admin.py 수정

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)


5. 결과

0개의 댓글