[Django Tutorial] Blog 만들기 (6)
웹 프로그래밍

[Django Tutorial] Blog 만들기 (6)

728x90
반응형

User 모델 Customization

 

1. models.py 에서 owner 설정

* on_delete가 CASCADE 방식이라는 의미는 외래키로 잡혀있는 User table에서 특정 레코드가 삭제되었을 때 그 레코드에 연결되어 있는 Post table의 레코드도 같이 삭제한다는 의미

class Post(models.Model):

    title= models.CharField(verbose_name='TITLE',max_length=50) #제목
    description= models.CharField('DESCRIPTION', max_length=100, blank=True, help_text='simple description text.' )#요약
    content= models.TextField('CONTENT') #글내용
    create_dt= models.DateTimeField('CREATE DATE', auto_now_add=True) #생성날짜와 시간
    modify_dt= models.DateTimeField('MODIFY DATE', auto_now=True )#수정날짜와 시간
    tags= TaggableManager(blank=True)
    owner= models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='OWNER', blank=True, null=True)

여기서 중요한 점은 User table을 사용하고 있다는 점이다. User는 인증을 위한 기본 테이블로써 프로젝트 초기에 잘 설정해야함. 즉, 인증테이블을 어떻게 만들 것인지를 고려해야한다.

 

(1) 인증테이블과는 별개로 proxy model을 만드는 방법

: 동작에 관련된 기능들(ex. table의 ordering 기준컬럼을 바꾸거나 인증테이블에 메서드를 추가) 이 있는 경우

(2) 인증테이블과는 별개로 profile model을 만드는 방법

: 장고가 제공하는 usertable을 그대로 사용하면서 컬럼을 추가/삭제 하는 등 컬럼 변경을 하는 경우

(3) Abstract User model을 상속받아서 인증테이블을 만드는 방법

: 별도의 인증테이블을 만들지만 인증컬럼으로 username 컬럼을 사용하는 경우

(4) Abstract BaseUser table을 상속받아서 인증테이블을 만드는 방법

: 별도의 인증테이블을 만들면서 인증컬럼도 username이 아닌 다른 컬럼을 사용하는 경우 

 

2. 인증테이블이 소속될 앱 생성

* owner부분 우선 주석처리

(a)

> python manage.py startapp accounts

 

(b)

accounts 생성 확인 후 settings.py에 등록

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'taggit',

    'accounts.apps.AccountsConfig',
    'blog.apps.BlogConfig',
]

* AccountsConfig는 생성된 accounts/apps.py보면 정의되어 있다.

 

(c)

accounts/models.py에 새로운 인증테이블 정의

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    pass

이렇게 별도의 User table을 정의하면 실제로는 장고가 제공하는 user table과 동일하면서도 차후에 컬럼 추가등을 쉽게 할 수 있게된다.

 

(d)

accounts/admin.py 

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from accounts.models import User

admin.site.register(User, UserAdmin) #user는 내가 만든거, useradmin은 장고제공사용

 

(e)

인증테이블을 settings.py에 등록

테이블을 등록할때는 앱이름과 모델이름을 같이 써주면 된다.

AUTH_USER_MODEL='accounts.User'

 

(f) 

migration 실행

python manage.py makemigrations

python manage.py migrate : 에러가 발생

* 에러가 나는 이유는 장고가 제공하는 인증테이블이 있는 상태에서 새로운 인증테이블을 만들고 있기 때문이다.

프로젝트의 최초 migrate 명령 이전에 인증테이블을 만들어야한다. 

 

(해결책)  sqlite 파일을 지우고 다시 시작한다. 메시지 무시하고 Do Refactor 눌러서 삭제하면 된다.

 

-다시 db작업

python manage.py migrate

 

-db 생겼으니 관리자 계정도 새로 만든다.

python manage.py createsuperuser

 

* 간간히 db가 꼬이거나 하면 sqlite날리고 다시 하면 된다. mysql이나 다른 db면 쉽지 않음.

장고의 ORM덕분에 db를 변경하는건 쉽다. sqlite쓰고 나중에 다른 db로 바꾸던가 하면 됨.

 

(g)

Post table에 반영 (blog/models.py) owner 수정

from django.contrib.auth import get_user_model
from django.db import models
from django.urls import reverse
from taggit.managers import TaggableManager


class Post(models.Model):

    title= models.CharField(verbose_name='TITLE',max_length=50) #제목
    description= models.CharField('DESCRIPTION', max_length=100, blank=True, help_text='simple description text.' )#요약
    content= models.TextField('CONTENT') #글내용
    create_dt= models.DateTimeField('CREATE DATE', auto_now_add=True) #생성날짜와 시간
    modify_dt= models.DateTimeField('MODIFY DATE', auto_now=True )#수정날짜와 시간
    tags= TaggableManager(blank=True)
    owner= models.ForeignKey(get_user_model(), on_delete=models.CASCADE, verbose_name='OWNER', blank=True, null=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail', args=(self.id,))

    def get_prev(self):
        return self.get_previous_by_modify_dt()

    def get_next(self):
        return self.get_next_by_modify_dt()

인증테이블 이름을 직접 쓰는 대신에 get_user_model() 사용. 

 

* 새로만든 인증테이블을 지정하는 방법 4가지

1. import... User

: 새로만든 유저테이블을 임포트

2. 'accounts.User'

: 앱이름과 모델이름을 같이 써서 사용

3. settings.AUTH_USER_MODEL

4. get_user_model()

: 장고제공함수 사용

 

(h)

owner column이 추가됐으니까 migration 실행

python manage.py makemigrations

python manage.py migrate

 

 

 

 

728x90
반응형