Custom User Model
Django에는 User Model을 만들 수 있는 내장 어플리케이션이 존재한다.
이를 그냥 사용해도 되지만 몇가지를 더 곁들이기 위해서는 다음과 같은 동작을 수행해야한다.
1. Create Custom User Model Application
poetry shell에서 새로운 어플리케이션을 만들어주는 명령어를 입력한다.
python manage.py startapp users
이렇게 되면 users 폴더가 만들어진다.
2.InHerit AbstractUser
users의 models.py에 들어가서 다음과 같이 입력하면 내장어플리케이션을 상속받을 수 있다.
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
pass
그리고 manage.py가 이 users app을 관찰할 수 있도록 manage.py에 등록해 주고 새로운 유저인증 모델을 지정한다.. 여기서 제일 중요한것은 유저인증 모델을 새로이 지정해줘야한다.
AUTH_USER_MODE = 'users.user'
3. Mirgate User Model
데이터베이스 새로운 model 생겼으므로 등록을 해줘야한다. 데이터가 존재하면 migrate할때 안될수도 있으니 데이터베이스 파일과 migrations 파일 내부에 있는 000_initial.py파일들을 삭제한다.
python manange.py makemigrations
python manange.py migrate
를 해주면 된다.
4.Editting User Model
기존에 있던 model에 새로운 column을 추가하거나 사용하지 않는 방법은 다음과 같다.
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
first_name = models.CharField(max_length=150, editable=False)
last_name = models.CharField(max_length=150, editable=False)
name = models.CharField(max_length=150)
is_host = models.BooleanField()
이후 makemigrations을 하게 되면 에러가 나온다. 이유인 즉슨 기존 model이 name과 is_host에 null 값을 받을 수가 없기 때문이다.이를 해결하기 위해서는 null=True나 default = value를 통해서 해결할수 있다. 개인적으로 default=value가 더 좋아보인다.
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
first_name = models.CharField(max_length=150, editable=False)
last_name = models.CharField(max_length=150, editable=False)
name = models.CharField(max_length=150, default="")
is_host = models.BooleanField(default=False)
5. FieldSet
user model를 추가한 후 user의 세부사항을 보기 위해 user를 클릭하게 되면 editable False에 의해 user의 fieldset을 바꿔줘야한다.
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
@admin.register(User)
class CustomAdmin(UserAdmin):
fieldsets=None
field = ("username","email","password","name","is_boolean",)
fieldset말고 field를 이용해 간결하게 사용해도 되지만 fieldsets은 admin 만의 section을 만들 수 있고 확장성이 용이하다.
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
# Register your models here.
@admin.register(User)
class CustomUserAdmin(UserAdmin):
fieldsets = (
("Profile",
{"fields": ("username", "email", "password", "name", "is_boolean"), },
),
("Permissions",
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
"classes": ("collapse",)
},),
("Important dates", {"fields": ("last_login",
"date_joined"), "classes": ("collapse",), },),
)
list_display = ("username", "email", "name", "is_boolean")
6.Foreign Keys
다른 모델과 연결하기 위해서는 Foreign Key를 이용해야한다. 쉽게 이해하자면 id값을 연결시켜주는 행위이다. Django에서는 id라 부르지 않고 PK(Primary Key)라고 부른다. user model를 연결하고자 하는 model에 column을 변수를 추가하고 Foreign Key를 입력해준다. 연결된 model은 유저가 삭제되면 같이 삭제되기위해 on_Delete=model.CASCADE도 작성해준다.
owner = models.ForeignKey("users.User", on_delete=models.CASCADE)
이또한 새로운 column이 추가되었기때문에 migrate를 해줘야한다. 그냥 migrate를 하게되면 기존에 있던 house model에 owner라는 column이 없기 때문에 default 값을 지정해줘야하기때문에 개발 초기나 default값을 지정하기 귀찮다면 db와 migrations의 파일을 지우고 다시 migrate를 하면 된다.
'CODING PRACTICE > Python' 카테고리의 다른 글
Django__001 (0) | 2024.07.19 |
---|---|
Object Oriented Programming (객체지향프로그램) (0) | 2024.07.18 |
Python__Basic__002 (0) | 2024.07.17 |
Python__Basic__001 (2) | 2024.07.16 |