mysite라는 이전에 만든 container 내부에 polls application을 만들어줍니다. Django는 application의 기본 directory 구조를 자동으로 생성할 수 있는 도구를 제공해줍니다.
$ python manage.py startapp polls
이제 polls라는 directory가 생성되었습니다. 이 directory 구조는 다음과 같습니다.
polls/
__init__.py
admin.py # 관리자 권한을 가지는 사용자가 볼 수 있는 페이지에 관련된 설정 파일
apps.py
migrations/ # 해당 application에 관련된 DB의 변경사항들을 기록해두는 파일들이 저장되는 directory입니다.
__init__.py
models.py
tests.py
views.py
현재 mysite project에 polls app을 인식시키기 위해서 app의 구성 클래스(config) path를 project setting 파일에 입력해주면 된다. /mysite/mysite/setting.py
에 들어가서 경로를 수정해준다.
# Application definition
INSTALLED_APPS = [
'polls.apps.PollsConfig', # django가 polls라는 app이 포함되었다는 사실을 알린다.
여기서 config module의 이름 app이름 + config이며, app의 제일 앞 글자는 대문자이다.
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
]
polls/view.py
를 열어 첫번째 줄은 건너뛰고 다음과 같은 python 코드를 입력합니다.
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
이는 Django에서 가장 간단한 형태의 view입니다. View를 호출하기 위해서는 이와 연결된 url이 있어야 하는데, 이를 위해서 URLconf(url 요청이 들어오면 어떤 views.py의 함수를 실행시킬지 정의하는 단계)가 사용됩니다.
polls directory에서 URLconf를 생성하려면, urls.py
라는 파일을 생성해야 합니다.
polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py urls.py # URLconf 생성을 위해 만든 파일 views.py
urls.py
에 아래와 같은 코드를 입력해준다.
#polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
다음 단계는, 최상위 URLconf
에서 polls.urls
모듈을 바라보게 설정합니다. mysite/urls.py
파일을 열고, django.urls.include
를 import 하고, urlpatterns 리스트에 include() 함수를 다음과 같이 추가합니다.
#mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
include() 함수는 다른 URLconf들을 참조할 수 있도록 도와줍니다. Django가 함수 include()를 만나게 되면, URL의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include 된 URLconf로 전달합니다.
include()를 쓰는 이유는 URL을 쉽게 연결할 수 있기 때문입니다. polls 앱에 그 자체의 URLconf(polls/urls.py)가 존재하는 한,/polls/
, 또는/fun_polls/
,/content/polls/
와 같은 경로, 또는 그 어떤 다른 root 경로에 연결하더라도, 앱은 여전히 잘 동작할 것입니다. Django공식문서
이와 같은 작업을 마친 후 python manage.py runserver
를 입력해서 브라우저에 "http://localhost:8000/polls/"를 가게 되면 polls/view.py
에서 정의한 "Hello, world. You're at the polls index."가 나타납니다.
Django에서는 기본적으로 SQLite를 사용할 수 있도록 구성이 되어있습니다. 하지만 이 후에 좀 더 확장성있는 DB를 사용하기 위해서는 설정과 default값을 바꿔줘야 합니다.
이제, mysite/settings.py
파일을 열어서 현재 사는곳에 시간대(Asia)를 맞춰 TIME_ZONE값 설정을 바꿔주겠습니다.
TIME_ZONE = 'UTC' -> TIME_ZONE = 'Asia/Seoul'
기본으로 설정되어있는 UTC값을 Asia/Seoul로 바꾸면 됩니다.
mysite/settings.py
파일에 있는 INSTALLED_APPS는 현재 Django instance에서 활성화된 모든 django의 application들의 이름이 있습니다. 이 app들은 여러 프로젝트에 사용이 가능하며 쉽게 쓰일 수 있게 패키징하여 배포도 가능합니다. 기본적으로 아래와 같은 app들을 포함합니다.
django.contrib.admin– 관리용 사이트.
django.contrib.auth – 인증 시스템.
django.contrib.contenttypes – 컨텐츠 타입을 위한 프레임워크.
django.contrib.sessions – 세션 프레임워크.
django.contrib.messages – 메세지 프레임워크.
django.contrib.staticfiles – 정적 파일을 관리하는 프레임워크.
이 app들은 기본으로 제공됩니다. 이런 몇몇 기본 app들도 사용하기 위해서는 최소 하나 이상의 DB table을 필요하기 때문에 다음의 명령을 실행해야 합니다.
python manage.py migrate
migrate 명령어는 /mysite/settings.py
파일 내부에 있는 INSTALLED_APPS 를 보고 필요한 데이터 베이스를 생성하거나, 수정사항을 저장하는 역할을 합니다.
Models이란 부가적인 metadata를 가진 DB의 layout을 말합니다. Models는 데이터에 대한 단 하나의 확실한 정보 출처입니다. 여기에는 저장 중인 데이터의 필수 필드 및 동작이 포함됩니다. 이번에는 polls app에서 Question과 Choice라는 두가지 models를 만들겁니다.
이를 위해 polls/models.py를 다음과 같이 수정합니다.
# polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
이곳에서 각 model은 django.db.models.Model의 하위 클래스로 표현됩니다. 각 model마다 여러 클래스 변수가 있으며, 각 클래스 변수는 model에서 DB field를 나타냅니다.
DB의 각 field는 field클래스의 instance로 표현됩니다. CharField는 character field를 표현하고, DateTimeField는 날짜와 시간(datetime)field를 표현합니다.
각 Field instance의 이름(question_text/pub_date)는 DB field 이름입니다.
어떠한 Field 클래스들은 필수 인수가 필요합니다. 예를 들어, CharField의 경우는 max_lenght를 입력해줘서 최대 character의 길이를 설정해주어야 한다.
가장 먼저 현재 프로젝트에 polls app을 설치했다는것을 알려야 합니다. mysite/settings.py
에 들어가서 INSTALLED_APPS설정에 추가를 해야합니다. PollsConfig클래스는 polls/apps.py
에 존재합니다. 따라서 polls.apps.PollsConfig
를 INSTALLED_APPS에 추가해주면 Django가 polls app이 포함이 되었다는걸 알게 됩니다.
활성화 하기 전 해야하는 것 makemigrations 라는 명령어로 model을 변경시킨 사실 (또는 생성했다는 사실)과 이 변경사항을 migration으로 저장시키고 싶다는 것을 Django에게 알려줘야 한다.
$ python manage.py makemigrations polls
#다음과 같은 것들이 생성됩니다.
#Migrations for 'polls':
# polls/migrations/0001_initial.py
# - Create model Question
# - Create model Choice
이제 migrate를 실행시켜 DB에 model과 관련된 table를 생성합니다.
$ python manage.py migrate
migrate 명령은 아직 적용되지 않은 migration을 모두 수집해 이를 실행하며(Django는 django_migrations table을 두어 migration 적용 여부를 추적합니다) 이 과정을 통해 model에서의 변경 사항들과 DB의 스키마의 동기화가 이루어집니다.
migration은 마치 프로젝트를 개발할 때처럼 DB나 table에 손대지 않고도 model의 반복적인 변경을 가능하게 해줍니다. 동작 중인 DB를 자료 손실 없이 업그레이드 하는 데 최적화 되어 있습니다.