๐ Custom User Model
๐ฅ Substituting a custom User model
๐ฅ Model field
1. Django custom User model
1) createsuperuser
- admins site(http://127.0.0.1:8000/admin)๋ก ์ ๊ทผํ๋ฉด Admin Site์ ์ ๊ทผํ๊ธฐ ์ํ ๋ก๊ทธ์ธ์ฐฝ์ด ๋ํ๋๋๋ฐ์,, console ๋ช
๋ น์ ํตํด ๊ด๋ฆฌ์ ๊ณ์ (superuser)์ ์์ฑ ํ ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๐ python manage.py createsuperuser
- ๋ช
๋ น์ผ๋ก ๊ฐํธํ๊ฒ ๊ด๋ฆฌ์ ๊ณ์ ์ ์์ฑ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ Django๊ฐ ์ด๋ฏธ User ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด์์. ๋ฐ๋ผ์ Django๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ User ๋ชจ๋ธ("AbstractUser")์ ์์๋ฐ๊ณ ์ด๋ฅผ ํ์ฅ์์ผ ์ฌ์ฉํด๋ณผ๊ป์.
- Django๊ฐ ๊ฐ์ง User ๋ชจ๋ธ์ ์ถ๊ฐ๋ก ํ๋๋ฅผ ํ์ฅ์ํค๊ธฐ ์ํด์ settgins.py์ ์ค์ ์์ ์๋์ ๊ฐ์ด ๋ช
์ํด ์ฃผ์ด์ผํด์. ์ด๋ฅผ "Substituting a custom User model"๋ผ ํฉ๋๋ค.
AUTH_USER_MODEL = "users.User"
2) models.py
- settgins.py์ ์ค์ ์ ํตํด Django์ ๋ชจ๋ธ์ ์์๋ฐ๊ธฐ๋ก ์ค์ ํ์๋ค๋ฉด, models.py์์ "AbstractUser"๋ฅผ ์์ ๋ฐ์์ต๋๋ค.
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
pass
- ํน์, ์ด๋ฏธ superuser๋ฅผ ํตํด ๊ด๋ฆฌ์ ๊ณ์ ์ ์์ฑํ์๊ฑฐ๋, Model์ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์กด์ฌํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค๋ฉด, DB๋ฅผ ์ด๊ธฐํ์ํค๊ธฐ ์ํด์ "db.sqlite3"๋ฅผ ์ง์ฐ๊ณ migration ์์ผ์ฃผ์ธ์!
- ๐ "db.sqlite3" ์ญ์
- ๐ python manage.py makemigrations && python manage.py migrate
3) admin.py
- ์์ฑํ Model์ Admin Site์์ ๋ํ๋๊ฒ ํ๋ ค๋ฉด,, Model์ admin.py์ ๋ฑ๋ก์์ผ์ค์ผ ํฉ๋๋ค.
from django.contrib import admin
from . import models
@admin.register(models.User)
class CustomUserAdmin(admin.ModelAdmin):
pass
2. Model field
1) ImageField()
- ImageField๋ ์ด๋ฏธ์ง ํ์ผ์ ์ ์ฅํ๋ ํ๋์์,, ์๋ ์ค๋ฅ๊ฐ ๋ํ๋๋ค๋ฉด "pillow"๋ฅผ ์ค์นํฉ๋๋ค:)
- "pillow" ์ค์น ๋ฐฉ๋ฒ : ๐ pipenv install pillow
2) CharField() & TextField()
- CharField๋ ์ฑ๋ณ, ์ ๋ชฉ, ์ด๋ฆ ๋ฑ ์งง์ Text๋ฅผ ์ํ Field์ด๊ณ , TextField๋ ์๊ฐ, ์ค๋ช
๋ฑ ๊ธด ๋ฌธ์ฅ์ ์ ์ฅํ๋ Field๊ฐ ํ์์
๋๋ค.
- max_length ์์ฑ
- CharField์์๋ ํ
์คํธ์ ๊ธธ์ด๋ฅผ ์ ํํ๊ธฐ ์ํด max_length ์์ฑ์ ํญ์ ์ด์ฉํฉ๋๋ค.
- null ์์ฑ
- null์ ๋น๊ฐ์ DB์ ํ์ฉํ์ง ๊ฒฐ์ ํ๋ ์์ฑ์ผ๋ก default๋ก "null=False"๊ฐ ์ ์ฉ๋์ด ์์ผ๋, "null=True"๋ก ์ง์ ํ๋ฉด, DB์ ๋น๊ฐ์ ํ์ฉ์ํต๋๋ค.
- console์ ์๋์ฒ๋ผ ๋ํ๋ ๊ฒ์ ๊ธฐ์กด์ ์ด๋ฏธ ์์ฑ๋ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ํ ๊ฑด์ง์ ๋ํด ๋ฌผ์ด๋ณด๋ ๊ฑฐ์์:) 1๋ฒ์ console์์ ์ฒ๋ฆฌํ๊ฒ ๋ค๋ ์๋ฏธ์ด๊ณ , 2๋ฒ์ ํ์ฌ ๋ช
๋ น์ ์ทจ์ํ๊ณ ์๋ํฐ์์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค.
- default ์ต์
- default๋ฅผ ์ฌ์ฉํ๋ฉด DB์ ํ๋๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ, ํ๋๊ฐ์ null๋ก ๋๋๊ฒ ์๋๋ผ default๋ก ์ง์ ํ ์ ์์ด์. default๋ฅผ ํตํด ์ด๋ฏธ ์์ฑ๋ ๋ฐ์ดํฐ์ ํด๋น ํ๋๊ฐ์ ""์ ๋ด์ฉ์ผ๋ก ์ฑ์์ค ์ ์์ด์!
- blank ์์ฑ
- blank๋ฅผ ์ฌ์ฉํ๋ฉด Admin Panel ์์ ๋น ๊ฐ์ ํ์ฉ์ํฌ์ง ๊ฒฐ์ ํ ์ ์์ด์. default๋ก๋ "blank=False"์ด๋ฉฐ, "blank=True"๋ก ์ง์ ํ๋ฉด Admin Site ์์์ form์ ๋น๊ฐ์ ํ์ฉ์ํต๋๋ค. ์ด์ "blank=True" ์ง์ ํ๋ฉด Admin Panel์ "This field is required" ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์์!
- ์๋ก์ด ํ๋๋ฅผ ์ถ๊ฐํ์๊ฑฐ๋, ํ๋๊ฐ ์์ ๋์๋ค๋ฉด migrate๋ก ์งํํด์ฃผ์ด์ผ ๋ฐ์๋ฉ๋๋ค:)
- ๐ python manage.py makemigrations โ python manage.py migrate
- choices ์์ฑ
- choices ์ต์
์ CharField ํ๋์์ ์ ํ ๋ชฉ๋ก์ ์ ๊ณตํด ์ค๋๋ค. ์ ํ ๋ชฉ๋ก์ ์์๋ก ๋ง๋ค์ด choices์ ๊ฐ์ผ๋ก ์ง์ ํ๋ฉด ์๋์ฒ๋ผ ์ ํ ๋ชฉ๋ก์ด ํ์๋ฉ๋๋ค. ์ฐธ๊ณ ๋ก ์ด ์์ฑ์ ํ๋์ form ์์์ customํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ migrate๋ฅผ ํด์ฃผ์ง ์์๋ ์ ์ฉ๋์:)
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
"""Custom User Model"""
GENDER_MALE = "male"
GENDER_FEMALE = "female"
GENDER_OTHER = "other"
GENDER_CHOICES = (
(GENDER_MALE, "Male"),
(GENDER_FEMALE, "Female"),
(GENDER_OTHER, "Other"),
)
LANGUAGE_ENGLISH = "en"
LANGUAGE_KOREAN = "kr"
LANGUAGE_CHOICES = (
(LANGUAGE_ENGLISH, "English"),
(LANGUAGE_KOREAN, "Korean"),
)
avatar = models.ImageField(null=True, blank=True)
gender = models.CharField(choices=GENDER_CHOICES, max_length=10, null=True, blank=Tru)
bio = models.TextField(default="", blank=True)
language = models.CharField(choices=LANGUAGE_CHOICES, max_length=2)
3) DateTimeField() vs DataField()
- DateTimeField๋ ๋ ์ง์ ์๊ฐ๊น์ง ์
๋ ฅ์ ์ ๊ณตํ๋ ํ๋์ด๋ฉฐ, DateField ๋ ์ง๋ง ์
๋ ฅ์ด ํ์ํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ๐ birthdate = models.DateField(null=True)
- ์ต์
์ผ๋ก๋ "auto_now"์ "auto_now_add"๊ฐ ๋ํ์ ์
๋๋ค.
- auto_now : Model์ Object๊ฐ ์ ์ฅ๋ ๋๋ง๋ค ๊ฐ์ ๊ฐฑ์
- auto_now_add : Model์ Object๊ฐ ์ต์ด ์ ์ฅ ๋๋ง ๊ฐ์ ์ ์ฅ
4) BooleanField
- BooleanField๋ False์ True๊ฐ๋ง ์ ์ฅํ ๋ ์ฌ์ฉํ๋ Field์ด๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก default ์ต์
๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
- ๐ superhost = models.BooleanField(default=False)
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
"""Custom User Model"""
GENDER_MALE = "male"
GENDER_FEMALE = "female"
GENDER_OTHER = "other"
GENDER_CHOICES = (
(GENDER_MALE, "Male"),
(GENDER_FEMALE, "Female"),
(GENDER_OTHER, "Other"),
)
LANGUAGE_ENGLISH = "en"
LANGUAGE_KOREAN = "kr"
LANGUAGE_CHOICES = (
(LANGUAGE_ENGLISH, "English"),
(LANGUAGE_KOREAN, "Korean"),
)
CURRENCY_USD = "usd"
CURRENCY_KRW = "krw"
CURRENCY_CHOICES = (
(CURRENCY_USD, "USD"),
(CURRENCY_KRW, "KRW"),
)
avatar = models.ImageField(null=True, blank=True)
gender = models.CharField(
choices=GENDER_CHOICES, max_length=10, null=True, blank=True
)
bio = models.TextField(default="", blank=True)
birthdate = models.DateField(null=True)
language = models.CharField(
choices=LANGUAGE_CHOICES, max_length=2, null=True, blank=True
)
currency = models.CharField(
choices=CURRENCY_CHOICES, max_length=3, null=True, blank=True
)
superhost = models.BooleanField(default=False)
- Birthdate๋ง Bold๊ฐ ์ ์ฉ๋์๋๋ฐ, ์ด๋ blank=False์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฆ, Admin Site์์ ๋น๊ฐ์ ํ์ฉํ์ง ์๊ฒ ๋ค๋ ์๋ฏธ์ด์ฃ . ์ด ์ฒ๋ผ ๋ฐ๋์ ์
๋ ฅํด์ผ ์ ์ฅํ ์ ์๋ ํ๋๋ Bold๊ฐ ์ ์ฉ๋ ์์ต๋๋ค:)