νλ‘μ νΈμ λ§κ² μ¬μ©μ λͺ¨λΈμ μνλλλ‘ μ μν΄μ£ΌκΈ° μν΄ AbstractBaseUserλ₯Ό μ¬μ©ν΄λ΄€μ΅λλ€.
Djangoλ λ΄μ₯ μ¬μ©μ λͺ¨λΈμ μ¬μ©ν μλ μμ§λ§,
AbstractBaseUserλ₯Ό μ¬μ©νμ¬ μ¬μ©μ λͺ¨λΈμ μ μνλ©΄, Djangoμ λ΄μ₯ μ¬μ©μ λͺ¨λΈμ νμ₯νκ³ μ»€μ€ν°λ§μ΄μ¦ν μ μμ΅λλ€. νμν νλλ₯Ό μΆκ°νκ±°λ κΈ°λ³Έ νλλ₯Ό λ³κ²½νλ λ± νλ‘μ νΈμ λ§λ κ³ μ ν λ°μ΄ν° λͺ¨λΈμ μ μν μ μμ΅λλ€.
λν, μ¬μ©μ μΈμ¦ μμ€ν λ νλ‘μ νΈμ λ§κ² μ§μ ꡬνν λ°©μμΌλ‘ μ μ΄ν μ μμ΄ μ¬μ©μ λ°μ΄ν°μ 보μμ λ§κ» κ°μ ν μ μμ΅λλ€.
"""
'AbstractBaseUser'λ₯Ό μ¬μ©νμ¬ μ¬μ©μ λͺ¨λΈμ 컀μ€ν°λ§μ΄μ§νκ³ μ¬μ©μ λͺ¨λΈμ 보μμ μΌλ‘ κ°ννκ³ μ¬μ©μ μΈμ¦μ κ°μ νκΈ° μν΄ 'BaseUserManager'λ₯Ό μ¬μ©νκ² μ΅λλ€.
'AbstractBaseUser'λ₯Ό μμνμ¬ μ¬μ©μ λͺ¨λΈμ μ μνλ©΄, μ¬μ©μλͺ
, μ΄λ©μΌ λ±κ³Ό κ°μ κ³ μ ν μλ³μλ₯Ό μ¬μ©νμ¬ μΈμ¦ν μ μμ΅λλ€.
'BaseUserManager'λ₯Ό ν΅ν΄ νμν λ©μλλ₯Ό μΆκ°νμ¬ μ¬μ©μλ₯Ό μμ±νκ³ λΉλ°λ²νΈ μ€μ λ° λ³κ²½, μ¬μ©μ κ·Έλ£Ή λ° κΆν κ΄λ¦¬ λ±μ μμ
μ μνν μ μμ΅λλ€.
μ°Έκ³ : https://docs.djangoproject.com/en/4.1/topics/auth/customizing/ ' (μ°Έμ‘° : 'A full example')
"""
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
import random
class UserManager(BaseUserManager):
"""μ¬μ©μ λͺ¨λΈμ μμ±νκ³ κ΄λ¦¬νλ μν μ νλ ν΄λμ€μ
λλ€."""
def create_user(self, email, password):
# μΌλ° μ¬μ©μλ₯Ό μμ±νλ λ©μλμ
λλ€.
if not email:
raise ValueError('μ ν¨νμ§ μμ μ΄λ©μΌ νμμ
λλ€.')
user = self.model(
email=self.normalize_email(email), # 'normalize_email' : Djangoμ 'django.contrib.auth.models' λͺ¨λμ μλ 'UserManager' ν΄λμ€μ ν¬ν¨λ λ©μλλ‘ 'AbstractBaseUser' λλ 'BaseUserManager'μ κ°μ μ¬μ©μ λͺ¨λΈ(User λͺ¨λΈ)μμ μ¬μ©λ©λλ€.
# μ΄λ©μΌ μ£Όμλ₯Ό μΌκ΄λ νμμΌλ‘ λ³ννλ μν μ ν©λλ€. μλ₯Ό λ€μ΄, μ¬μ©μκ° "UsEr@ExAmPle.CoM" μ΄λ κ² μ
λ ₯ν΄λ "user@example.com" μ΄λ κ² λ³νμμΌμ€λλ€.
password=password,
nickname=f"user!@#${random.randint(1000000000,999999999999999)}!@#$", # createsuperuserλ‘ μ¬μ©μ κ³μ μ μμ±ν λ, nicknameκ°μ λ°μ§ μκΈ° λλ¬Έμ λ°μ΄ν°λ² μ΄μ€μ nicknameκ°μ΄ λΉ μνλ‘ λ€μ΄κ°λλ°, λ λ²μ§Έ createsuperuserλ‘ μ¬μ©μ κ³μ μ μμ±ν λλΆν° λΉ κ°μ΄ λ λ€μ΄κ°κ² λλ©΄ 'unique=True'μ μμ± λλ¬Έμ μ€λ₯κ° λ°μν©λλ€. 'null=True', 'blank=True'λ‘ μμ±μ μ§μ ν΄λ λμ§λ§, μꡬ 쑰건과 λ§μ§ μκΈ° λλ¬Έμ μ
λ ₯μ μν΄μ€¬μ μμ λλ€ν κ°μΌλ‘ μ μ₯λλλ‘ μ€μ ν΄μ€λλ€.
)
user.set_password(password) # 'set_password' : μ¬μ©μμ λΉλ°λ²νΈλ₯Ό μ€μ νλ λ©μλλ‘ μ¬μ©μκ° μ 곡ν λΉλ°λ²νΈλ₯Ό μμ νκ² μ μ₯νκΈ° μν΄ ν΄μ±(hash)λ ννλ‘ μ μ₯ν©λλ€.
user.save(using=self._db) # 'using=self._db' μ΅μ
: μ μ₯ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ§μ νλ μν μ ν©λλ€. / save λ©μλ : μ¬μ©μ λͺ¨λΈ κ°μ²΄λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯νλ λ©μλμ
λλ€.
return user
def create_superuser(self, email, password):
# κ΄λ¦¬μλ₯Ό μμ±νλ λ©μλμ
λλ€.
if not email:
raise ValueError('μ ν¨νμ§ μμ μ΄λ©μΌ νμμ
λλ€.')
user = self.create_user(
email=self.normalize_email(email),
password=password,
)
user.is_admin = True # createsuperuserλ‘ μμ±λ κ³μ μ κ΄λ¦¬μ κΆνμ λΆμ¬ν©λλ€.
user.save(using=self._db)
return user
"""
μμ (email, password=password,)μμ κ° μΈμ μ λ¬ λ°©μμ΄ λ¬λΌμ μ 리ν΄λ΄€μ΅λλ€.
< ν¨μ νΈμΆ μ μΈμ μ λ¬ λ°©μ >
1. ν€μλ μΈμ ('μΈμμ΄λ¦=κ°' in python)
ν€μλ μΈμλ μΈμλ₯Ό ν¨μμ μ λ¬ν λ μΈμμ μ΄λ¦μ ν¨κ» μ§μ νλ λ°©μ
μΈμμ μμμ μκ΄μμ΄ λͺ
μμ μΌλ‘ μ΄λ€ μΈμμ μ΄λ€ κ°μ μ λ¬νλμ§ λͺ
ννκ² μ§μ ν μ μμ΅λλ€.
(email=email, password=password,)
2. μμΉ μΈμ
μμΉ μΈμλ μΈμλ₯Ό ν¨μμ μ λ¬ν λ μΈμμ μμμ λ°λΌ μ λ¬νλ λ°©μ
ν¨μ μ μ μμ μ μλ 맀κ°λ³μμ μμλλ‘ κ°μ μ λ¬ν΄μΌ ν©λλ€.
( email, password)
"""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
class User(AbstractBaseUser):
"""
컀μ€ν
μ¬μ©μ λͺ¨λΈμ μ μνλ ν΄λμ€μ
λλ€.
- email(νμ) : λ‘κ·ΈμΈ μ μ¬μ©ν μ¬μ©μμ μ΄λ©μΌ μ£Όμμ
λλ€.
- password(νμ) : λ‘κ·ΈμΈ μ μ¬μ©ν λΉλ°λ²νΈμ
λλ€.
- fullname(νμ) : μ¬μ©μμ μ΄λ¦μ
λλ€.
- nickname(νμ) : μ¬μ©μμ λλ€μμ
λλ€.
- λ€λ₯Έ μ¬λμ λλ€μκ³Ό μ€λ³΅λμ§ μλλ‘ μ€μ ν©λλ€.
- image : μ¬μ©μμ νλ‘ν μ¬μ§μ
λλ€.
- birthday : μ¬μ©μμ μλ
μμΌμ
λλ€.
- join_date : νμκ°μ
μΌμ λ° μκ°μ
λλ€.
- νμκ°μ
ν μκ°μ μλμΌλ‘ μ μ₯νλλ‘ μ€μ ν©λλ€.
- is_active : κ³μ νμ±ν μ¬λΆμ
λλ€.
- True νΉμ Falseλ₯Ό μ μ₯ν μ μμΌλ©°, κΈ°λ³Έκ°μΌλ‘ Trueλ₯Ό μ μ₯νλλ‘ μ€μ ν©λλ€.
"""
email = models.EmailField(
verbose_name="μ΄λ©μΌ", # 'verbose_name' : νλμ labelμ
λλ€. [ 1. λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ νμλλ νλ μ΄λ¦ μ§μ 2. κ΄λ¦¬μνμ΄μ§μ νμλλ νλ μ΄λ¦ μ§μ 3. μλ¬λ©μμ§μ νμλλ νλ μ΄λ¦ μ§μ 4. μ리μΌλΌμ΄μ μ νμλλ νλ μ΄λ¦ μ§μ ]
max_length=255,
unique=True, # 'unique=True' : κ°μ λͺ¨λΈ ν΄λμ€μ μ¬λ¬ μΈμ€ν΄μ€μμ λμΌν κ°μ κ°μ§ μ μλ€λ κ²μ μλ―Έν©λλ€.
)
password = models.CharField(verbose_name="λΉλ°λ²νΈ", max_length=255) # λΉλ°λ²νΈλ ν΄μ±λμ΄ μ μ₯λκΈ° λλ¬Έμ μ΅λ κΈΈμ΄λ₯Ό κΈΈκ² μ€μ ν©λλ€.
fullname = models.CharField("μ΄λ¦", max_length=50)
nickname = models.CharField("λλ€μ", unique=True, max_length=50)
profile_img = models.ImageField("νλ‘ν μ΄λ―Έμ§", null=True, blank=True)
birthday = models.DateField("μλ
μμΌ", null=True, blank=True) # 'blank=True', 'null=True' μμ±μ λΆμ¬νμ¬ 'birthday'κ°μ μ νμ μΌλ‘ λ°μ μ μμ΅λλ€.
join_date = models.DateTimeField("κ°μ
μΌ", auto_now_add=True)
is_admin = models.BooleanField("κ΄λ¦¬μ κΆν μ¬λΆ", default=True)
is_active = models.BooleanField("κ³μ νμ±ν μ¬λΆ", default=True)
objects = UserManager() # κΈ°λ³Έ μ¬μ©μ μ§μ 맀λμ (objects μμ±μ μ μ)κ° μλ 컀μ€ν
λ μ¬μ©μμ λν 맀λμ λ₯Ό μ§μ ν©λλ€. κ΄νΈ ()λ UserManager ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , μ΄λ₯Ό objectsλΌλ μμ±μ ν λΉνλ μμ
μ€νμ μλ―Έν©λλ€.
USERNAME_FIELD = 'email' # 'USERNAME_FIELD' : λ‘κ·ΈμΈ μ μ¬μ©μ μλ³(μΈμ¦)μ μ¬μ©ν νλλ₯Ό μ§μ ν©λλ€.
REQUIRED_FIELDS = [] # 'REQUIRED_FIELDS' : μ¬μ©μ μμ± λ° μνΌμ μ μμ± μμ νμλ‘ μ
λ ₯ν΄μΌ νλ νλ μ΄λ¦μ 리μ€νΈ ννλ‘ μ§μ ν©λλ€.
def __str__(self):
return self.email
def has_perm(self, perm, obj=None): # μ¬μ©μ κ°μ²΄μ νΉμ κΆν μ¬λΆλ₯Ό νλ¨νλ λ©μλμ
λλ€. μ‘μΈμ€ μ μ΄ λ° κΆν κ΄λ¦¬μ μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄, κ΄λ¦¬μ νμ΄μ§μμ κ΄λ¦¬μμ λ±κΈμ λλ λ, λ‘μ§μ μΆκ°νμ¬ μ μν©λλ€.
return True
def has_module_perms(self, app_label): # μ¬μ©μ κ°μ²΄κ° νΉμ μ±(App) λλ λͺ¨λ(Module)μ λν κΆνμ κ°μ§κ³ μλμ§ μ¬λΆλ₯Ό νλ¨νλ λ©μλμ
λλ€.
return True
@property # @property : λ©μλλ₯Ό μμ±μ²λΌ μ κ·Όν μ μκ² λ§λ€μ΄μ£Όλ λ°μ½λ μ΄ν° μ
λλ€.
def is_staff(self): # μ¬μ©μκ° κ΄λ¦¬μμΈμ§ μλμ§λ₯Ό λνλ΄λ λ©μλμ
λλ€. '@property' λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ ν΄λΉ λ©μλλ₯Ό ν΅ν΄ is_staff μμ±(νλ)λ₯Ό κ°μμ μΌλ‘ μμ±ν μ μμ΅λλ€.
return self.is_admin
μ₯μ
λ¨μ
μ΄λ―Έ μ μλ μ¬μ©μ κ΄λ¦¬ λ° μΈμ¦ λ‘μ§μ μμνλ©΄μ νμν νλλ₯Ό μΆκ°νκ±°λ μμ ν μ μμ΅λλ€. μ¦, κΈ°λ³Έ μ¬μ©μ λͺ¨λΈμ νμ₯μ λλ€.
μ₯μ
λ¨μ
Djangoμ λ΄μ₯ μ¬μ©μ λͺ¨λΈμ μμ ν λ체νκ³ μΆμ λ μ¬μ©ν©λλ€.
μ₯μ
λ¨μ
π₯π£π€π₯ππ