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

hyuckhoon.ko·2020년 6월 16일

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언어에서도 void 및 null의 개념이 있다.

'값이 존재하지 않는 상태'
즉, 비어있는 상태를 명시적으로 언급하는 것이다.
값이 없다의 개념이다.(값이 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개의 댓글