Django CRUD 웹 프로젝트 #1 빠른 프로젝트 생성하기
장고를 이용하여 CRUD 블로그를 만드는 실습을 정리할 예정이다.
가상환경 설정
파이썬 프로젝트를 개발할 때마다 독립된 환경을 구축하는게 패키지나 버전 관리에 용이하므로, 가상환경을 만들겠다.
가상환경을 만드려면 일단 당연히 파이썬을 다운받아야한다.
(가상환경의 버전은 생성하는 파이썬의 버전과 일치한다.)
간단하게 python -m venv {가상환경이름}을 이용하여 가상환경을 생성한다.
python -m venv venv
그리고 가상환경을 사용할 때마다 아래와 같은 명령어를 입력한다.
#git bash 기준 venv가 있는 폴더에서 터미널로 실행시킬 경우
source venv/Scripts/activate
그 후 Django와 pillow 를 install 해준다. (원하는 버전이 있다면 ==을 뒤에 붙여 버전을 명시한다.)
pip install django
pip install pillow
pillow 같은 경우에는 파이썬의 이미지 관리 라이브러리인데, 이미지를 띄우거나 저장 기능을 구현할 것이므로 pillow를 install 해줘야 한다.(안 해주면 model에서 Imagefield 값을 갖는 컬럼은 적용하지도 못하고 오류가 난다.)
장고 프로젝트 시작하기
프로젝트 생성
프로젝트 폴더를 생성할 디렉터리에서 명령어를 실행한다.
django-admin startproject {프로젝트명} . #.을 입력해야 CWD(Current Working Directory)에 프로젝트 폴더를 생성한다
서버 시작하기
python manage.py runserver
구현할 웹사이트
앱 생성
스프링의 패키지처럼, 장고도 기능별로 분리된 작업 공간인 앱이 필요하다.
위에처럼 블로그의 기능을 가진 블로그 앱을 만든다고 하면
python manage.py startapp blog
이후에는 settings.py에 생성할 앱을 등록한다.
Settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog'
]
Models.py
테이블과 컬럼 그리고 속성등을 설정한다. 만약 포스트에 대한 테이블을 작성 시
class Post(models.Model):
title = models.CharField(max_length=30)
content = models.TextField() #글자수 제한 X
created_at = models.DateTimeField(auto_now_add=True) # 컬럼에 추가될 때 생김
updated_at = models.DateTimeField(auto_now=True) # 자동추가
author = models.ForeignKey(User, null=True, on_delete=models.CASCADE) #CASCADE()XXX 지워지게 되면 그 함수를 실행하라 CALL-BACK
이런 식으로 작성해주면 된다.
DB 생성
" 이하의 과정은 Model 작성 후 DB 테이블을 생성 및 적용하는 과정이다. "
Model 등에서 조작을 하여, 컬럼이 추가,삭제 및 속성이 변경되거나 테이블을 생성할 시에는 DB 테이블에 적용사항을 담은 migrations 파일을 생성한다.
python manage.py makemigrations
그리고 migrations을 DB에 적용하기 위한 명령어를 입력한다.
python manage.py migrate
관리자 계정 생성하기
관리자 권한으로 사이트를 관리하기 위해서는 관리자 계정을 생성하는 명령어를 입력한다.
python manage.py createsuperuser
아이디...비밀번호...이메일 등을 입력 후
localhost:8000/admin으로 접속하면
이렇게 로그인 할 수 있는 화면이 뜬다.
이후에는 각 모델에서 만든 테이블과 유저 관련한 조작을 할 수 있다. 참고로 관리페이지에 보이려면 미리 admin.py에 등록을 해야한다.
Admin.py
from django.contrib import admin
from .models import Post, Category, Tag
# Register your models here.
admin.site.register(Post)
admin.site.register(Category)
admin.site.register(Tag)
내가 작성한 Admin.py는 이러하다, 아직 Category나 Tag는 구축하지 않았으므로 그대로 따라할거면, 이 둘은 빼도 된다.
프로젝트 구조
.
|-- README.md
|-- blog
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- models.py
| |-- static
| |-- templates
| |-- tests.py
| |-- urls.py
| `-- views.py
|-- django_project
| |-- __init__.py
| |-- asgi.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|-- manage.py
Project 내부 구조는 manage.py가 가장 바깥에 나와 있으며, project의 초기값등을 설정할 수 있는 django_project 폴더와 blog 앱을 생성한 뒤 blog앱 폴더가 있음을 확인할 수 있다. (참고로 교수님은 django_project 내부에 앱 폴더가 들어있는 형식이던데... 이런 식으로 하면 blog app을 못 찾는 일이 벌어진다.)
Trouble shooting
언젠가부터 manage.py makemigrations 시 DB 테이블이 생성되지 않는 문제가 생긴다.
이럴 때는 manage.py makemigrations blog 후 manage.py migrate blog 처럼 직접 앱을 명시하는 방법으로 해결할 수 있다.