관리 메뉴

Storage Gonie

Django (19*) users앱의 User 모델 설명 및 확장 본문

웹개발/인스타 클론 (1) Django

Django (19*) users앱의 User 모델 설명 및 확장

Storage Gonie 2019. 6. 26. 01:13
반응형

디폴트로 생성되어있는 users앱의 User 모델 설명

Cookiecutter로 프로젝트를 생성했다면 users앱이 디폴트로 생성되어 있을 것이고, 
   그 밑의 models.py 파일을 살펴보면 User모델이 정의되어 있는 것을 볼 수 있을 것이다.
   이 모델은 허가된 사람들 즉, 회원가입한 사람들의 정보를 저장하는 것으로 사용된다.
   이것에 사용되는 모델은 settings/base.py에서 디폴트로 지정되어 있는 것인데 이를 변경할 수 있기도 하다.
   (이는 그대로 두며, 기존의 것을 확장하여 사용할 것임)

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _


class User(AbstractUser):

    # First Name and Last Name do not cover name patterns
    # around the globe.
    name = models.CharField(_("Name of User"), blank=True, max_length=255)

    def get_absolute_url(self):
        return reverse("users:detail", kwargs={"username": self.username})

- 이 User 모델은 AbstractUser 클래스를 상속받아 정의된 모델인데, 이를 통해 상속받는 것들은 다음과 같은 것들이 있다.
   사용자 정보에 대한 것들인데 username, first_name, last_name, email, date_joined 등이 있다.
   (상속받는 것 : command + AbstractUser클릭)

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    email = models.EmailField(_('email address'), blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

users앱의 User 모델 확장

회원정보에 website, bio, phone, gender를 추가하고자 한다.

# Constant
GENDER_CHOICES = (
    ('male, 'Male'),
    ('female, 'Female'),
    ('not-specified', 'Not specified'),
)

# 확장하여 추가해줄 필드
website = models.URLField(null = True)
bio = models.TextField(null = True)
phone = models.CharField(max_length=140, null = True)
gender = models.CharField(max_length=80, choices = GENDER_CHOICES, null = True)

- null이 가능하게 하는 이유는 기존에 존재하던 회원들은 이 필드들이 없어서 비어있을 텐데,
  이 설정을 주지 않으면 오류가 발생할 것이므로.

 

1. User모델에 필드 추가

from django.db import models

class User(AbstractUser):

    # First Name and Last Name do not cover name patterns
    # around the globe.
    name = models.CharField(_("Name of User"), blank=True, max_length=255)

    # Constant
    GENDER_CHOICES = (
        ('male', 'Male'),
        ('female', 'Female'),
        ('not-specified', 'Not specified'),
    )

    # 확장하여 추가해줄 필드
    website = models.URLField(null=True)
    bio = models.TextField(null=True)
    phone = models.CharField(max_length=140, null=True)
    gender = models.CharField(max_length=80, choices=GENDER_CHOICES, null=True)

    def get_absolute_url(self):
        return reverse("users:detail", kwargs={"username": self.username})

 

2. 변경사항을 DB에 반영

python manage.py makemigrations
python manage.py migrate

만약 반영하는 과정 없이 admin 사이트에 접속하려고 시도한다면 아래와 같이 colum들을 찾을 수 없다는 에러가 발생할 것이다.

 

반응형
Comments