본문 바로가기
Django

Django [관리자 페이지] 프로젝트 생성

by nyanguk 2021. 1. 28.

관리자 페이지를 커스텀하기 위해 어쩔 수 없이(공식문서가 두려워서가 아니고...)새로운 프로젝트를 만들기로 한다!

관리자 페이지를 활용하는 좋은 예제가 있어 튜토리얼로 진행해본다.

 

그대로 따라 해서는 하루종일 오류잡자 냠냠을 하고 있을지도 모른다. 그래서 이렇게 정리 해본다.

프로젝트 생성 

프로젝트 생성 초기설정은 이전 게시글에서 찾아볼 수 있으니 과정만 나열하고 빠르게 넘어가도록 한다.

mkdir Custom_admin
cd Custom_admin
python3 -m venv my
source my/bin/activate
django-admin startproject myadmin .
sudo apt-get install python-django
pip install django~=2.0.0

 


어플리케이션 생성하기

어플리케이션 생성

두개의 어플리케이션 member 와 post를 만든다. member는 글을 작성하고 수정하는 등의 활동들이 누구에 의해 행해졌는지 알아내기 위한 어플리케이션으로 장고에 기본으로 존재하는 auth.User를 대신하는 모델이다. post는 게시글에 대한 정보들을 담은 모델이다.

 

# 가상환경이 실행된 터미널 창에서
python manage.py startapp member
python manage.py startapp post

 

INSTALLED_APPS에 어플리케이션 등록하기 

생성된 어플리케이션을 프로젝트가 알 수 있도록 INSTALLED_APPS 에 'member' , 'post'를 추가한다.

# Custom_admin/mysdmin/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'member',
    'post'
]

 

모델 작성하기

Member

먼저 AbstractUser를 사용하기 위해서는 프로젝트의 settings.py를 수정해줘야한다. 장고가 가지고있는 auth.user와 충돌하기 때문에 아래의 코드를 settings.py에 추가 한다.

# Custom_admin/mysdmin/settings.py
AUTH_USER_MODEL = 'member.Member'
[app의 이름].[객체이름]을 사용한다.

아래와 같이 models.py를 완성 시킨다.

# Custom_admin/member/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class Member(AbstractUser):
    TYPE_PERMISSIONS =  (
        ('AD','관리자'),
        ('ET','에디터'),
        ('MB','일반'),
    )
    email = models.EmailField('이메일', max_length=255, unique =True)
    username = models.CharField('닉네임',max_length=30, unique =True)
    permission = models.CharField('권한', max_length=2, choices = TYPE_PERMISSIONS, default= 'MB')
    certification_date = models.DateField('인증일', default=None, null =True, blank =True)
    is_certificated =models.BooleanField('인증상태',default=False)

Post

post 어플리케이션에는 Category, Post, Comment 클래스가 존재한다. 

member의 Member 객체를 사용해야 하므로 member의 models모듈에서 Member 를 import  해야한다.

ForeignKey에는 최소 2개의 전달인자가 필요하며 첫번째로 어떤 속성을 참조할 것인지, 두번째로 on_delete를 사용하여 외래키로 설정한 속성의 한 요소가 삭제되었을때 어떤 조치를 취할 지 설정해야한다.

 

아래와 같이 models.py를 완성 시킨다.

# Custom_admin/post/models.py
from django.db import models 
from member.models import Member
# Create your models here.
class Category(models.Model):
    name = models.CharField('카테고리이름', max_length=20)

class Post(models.Model):
    member = models.ForeignKey(Member,verbose_name='작성자', on_delete=models.CASCADE)
    category = models.ForeignKey(Category,verbose_name='카테고리', on_delete=models.CASCADE)
    title = models.CharField('제목', max_length=255)
    content = models.TextField('내용')
    is_deleted = models.BooleanField('삭제된글', default=False)
    created_at = models.DateTimeField('작성일', auto_now_add=True) 

class Comment(models.Model):
    member = models.ForeignKey(Member, verbose_name='작성자', on_delete=models.CASCADE)
    post = models.ForeignKey(Post, verbose_name='원본글', on_delete=models.CASCADE)
    content = models.TextField()
    is_blocked = models.BooleanField('노출제한', default=False)

 

데이터베이스에 모델 전달하기

모델을 모두 완성 했다면 데이터베이스에 모델을 등록해보자 

python manage.py makemigrations [app이름] 을 사용하여 장고에게 변경사항을 전달한다. 

python manage.py makemigrations member
python manage.py makemigrations post

성공했을 때의 결과이다.

(my) jaeuk@jaeuk-cat:~/JaeUk/Django/Custom_admin$ python manage.py makemigrations member
Migrations for 'member':
  member/migrations/0001_initial.py
    - Create model Member
(my) jaeuk@jaeuk-cat:~/JaeUk/Django/Custom_admin$ python manage.py makemigrations post
Migrations for 'post':
  post/migrations/0001_initial.py
    - Create model Category
    - Create model Comment
    - Create model Post
    - Add field post to comment

 

 

그  후 실제 데이터베이스에 등록하기 위해서는 migrate를 사용한다.

python manage.py migrate