출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

www.youtube.com/watch?v=mOu9fpfzyUg&list=PL-51WBLyFTg2vW-_6XBoUpE7vpmoR3ztO&index=5

 

이 포스팅은 다음과 같은 youtube 영상을 따라하면서 배운 내용과 학습 내용을 담은 것이다:

  • Dennis Ivy - Database Model & Admin Panel |  Getting Started | Django Framework (3.0) Crash Course Tutorials (pt 5)

현재 Django Version 3.1.2 를 쓰고 있다. Django는 파이썬을 쓰는 오픈소스 웹 프레임워크이다. 웹사이트 만들때 주로 쓰며, 간단한 것이 큰 특징이다.

 

 

1. Creating a Superuser and Accessing Admin Panel

Django를 사용할 때, 결국엔 이 백엔드 자료들, database, accounts 등등을 관리해줄 관리자가 필요하다. Djangos는 여기서 superuser이라고 칭한다. 이 superuser을 만들기 위해서는 powershell에 다음과 같은 코드를 입력하면 된다:

python manage.py createsuperuser

username, password, email을 입력하면 된다. 그러고 난 후, python manage.py runserver를 통해 127.0.0.1:8000/admin에 들어가면 다음과 같은 화면이 뜬다:

Django Admin panel

createsuperuser command로 만든 username과 password를 통해 login하면 된다.

Login후 화면

Login하면 바로 이런 화면이 보일 것이다. 아직 user라고는 createsuperuser를 통해 나 자신을 만들었으므로, 한명만 있는것이 맞다.

 

2. Building a Model and Migrating:

Making Migrations

Django로 python manage.py runserver를 할 경우, 다음과 같이 You have 17 unapplied applications 등과 같은 표시가 뜬적이 있을 것이다. (나같은 경우 이미 migration을 몇번 했기 때문에 이는 일어나지 않는다.) 이러한 issue가 일어나는 이유는 Django가  sqlite와 같은 database를 setup을 시켜놨지만, migration을 아직 안했으므로 우리의 databse에는 아직 반영이 안됐다는 얘기이다. 이를 하기 위해서는 다음과 같이 하면된다:

python manage.py migrate

이렇게 하면 databse가 update된다.

 

이제는 우리의 models.py를 변형시켜 보자:

from django.db import models

class Customer(models.Model):
	name = models.CharField(max_length=200, null=True)
	phone = models.CharField(max_length=200, null=True)
	email = models.CharField(max_length=200, null=True)
	date_created = models.DateTimeField(auto_now_add=True, null=True)

	def __str__(self):
		return self.name

class Product(models.Model):
	CATEGORY = (
		('Indoor', 'Indoor'),
		('Out Door', 'Out Door'),
		)
	name = models.CharField(max_length=200, null=True)
	price = models.FloatField(null=True)
	category = models.CharField(max_length=200, null=True, choices=CATEGORY)
	description = models.CharField(max_length=200, null=True)
	date_created = models.DateTimeField(auto_now_add=True, null=True)

class Order(models.Model):
	STATUS = (
		('Pending', 'Pending'),
		('Out for delivery', 'Out for delivery'),
		('Delivered', 'Delivered'),
		)
	date_created = models.DateTimeField(auto_now_add=True, null=True)
	status = models.CharField(max_length=200, null=True, choices=STATUS)

여기서 CharField는 string을 반환시켜주는 것이다. max_length=200은 이 string의 최대 길이는 200자일 수 있고, null=true라는 뜻은 비어있는 상태, 즉 null 상태여도 괜찮다(True)는 뜻이다.

 

date_created에서 DateTimeField는 Field이름이 제시하듯이 시간을 나타내는 Field이다. auto_now_add=True는 이 값은 자동적으로 지금 현재 시각을 입력해준다는 것이다.

 

CATEGORY = ... 와 STATUS = ... 는 tuple이다. 여기서 이 tuple들은 choices=CATEGORY와 choices=STATUS에서 역할을 해주는데, 상태 선택 드롭다운바의 역할을 한다:

Dropdown bar for Category and Status

 

def __str__(self) 에서 return self.name은 admin panel에서 model의 이름을 제목으로 보여준다:

Django Admin Panel - Name of Models

하지만 단순히 . 이렇게 하고 python manage.py runserver를 하면 admin panel은 Customers, Orders, Prodcuts는 뜨지 않고 단순히 Groups와 Users만 뜨고 끝난다.

다음과 같은 몇가지를 해야 admin panel에 위의 사진과 같이 뜬다:

python manage.py makemigrations

첫번째로, CLI에 저 command를 쳐준다. 전과는 달리 이렇게 makemigration을 쳐주는 이유는 migration을 database에 setup을 먼저 해주는 것이다.

또한, crm1의 내부 파일들이 몇가지 추가된 것을 알 수 있다:

crm1
ㄴ accounts
   ㄴtemplates
     ㄴaccounts
   ㄴ __pycyache__
   ㄴ migrations
     ㄴ0001_initial.py
     ㄴ0002_order_product.py
     ㄴ__init__.py
   ㄴ __init__.py
   ㄴ admin.py
   ㄴ apps.py
   ㄴ models.py
   ㄴ tests.py
   ㄴ views.py
ㄴ cmr1
   ㄴ __pycyache__
   ㄴ __init__.py
   ㄴ asgi.py
   ㄴ settings.py
   ㄴ urls.py
   ㄴ wsgi.py
ㄴstatic
   ㄴcss
     ㄴmain.css
   ㄴimages
   ㄴjs
ㄴ db.sqlite3
ㄴ manage.py

0001_inital.py와 0002_order_product.py가 추가됐다. 이건 단순히 databse에 setup 시키는 용도라고 생각하면 된다.

 

python manage.py migrate

마지막으로 migrate를 해주면 databse에 setup 되어있던 것이 바로 반영된다.

 

중요한 점은 이렇게 makemigrations와 migrate는 model과 database를 바꿀때마다 해주어야한다. 그렇지 않는다면 때때로 바꾼 database가 성공적으로 반영되지 않고 말것이다.

 

더불어, 다음과 같은 코드도 admin.py에 추가해야 한다:

from django.contrib import admin
from .models import *

admin.site.register(Customer)
admin.site.register(Product)
admin.site.register(Order)

이러한 코드를 추가하는 이유는 admin에서 결국 읽어들여야 표시를 할 수 있는데, 이 Customer, Product, Order 모델을 읽어들일 수 있게끔 써놓은 것이다.