Django 04편 - polls app 구현하기 1편
이번에 django 공식 문서의 튜토리얼을 진행하면서 가능한 한 자세하게 다뤄볼 생각…
polls app을 만들어서 프로젝트에 붙이자!
- polls app 생성
1 2
mkdir django_demo/apps/polls django-admin startapp polls django_demo/apps/polls
- settings.py INSTALLED_APPS에 app 추가
1 2 3 4 5 6 7 8 9 10
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'apps.test_app', 'apps.polls', ]
테스트를 위한 view 추가
1 2 3 4 5 6 7 8 9 10
import logging from django.http import HttpResponse logger = logging.getLogger('debug') # Create your views here. def index(request): logger.debug('polls app test.') return HttpResponse("Hello, world. You're at the polls index.")
urls.py 생성
1 2 3 4 5 6
from django.urls import path from apps.polls import views as polls_views urlpatterns = [ path('', polls_views.index, name='index'), ]
프로젝트에 urls include
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
"""django_demo URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('test/', include('apps.test_app.urls')), path('polls/', include('apps.polls.urls')), ]
잘 작동하는지 테스트
- 로그
1 2 3
```text [DEBUG][C:\Users\****\Desktop\dev\github\django-demo\django_demo\apps\polls\views.py:index():9][16/Feb/2021 17:23:20] "polls app test." ```
- 웹 페이지
1
![사진](/assets/img/posts/legacy/python/django-04-001.png)
- 파일 구조
데이터베이스 사용해보기
- settings에서 타임존 설정하기
1 2
TIME_ZONE = 'Asia/Seoul' USE_TZ = False
모델 만들기 (models.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
import datetime from django.db import models from django.utils import timezone # Create your models here. class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def was_published_recently(self): return self.pub_date >= timezone.now() - datetime.timedelta(days=1) def __str__(self): return self.question_text class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text
migrate 하기
1
python manage.py makemigrations polls
위 명령어를 실행하면 아래와 같은 출력문이 나온다.
1 2 3 4
Migrations for 'polls': apps\polls\migrations\0001_initial.py - Create model Question - Create model Choice
이후 실행할 migrate 명령어는 migration들을 실행시켜주고 자동으로 데이터베이스 스키마를 관리해준다. 이 명령어를 실행하기 전에, migration이 내부적으로 어떤 SQL문장을 실행시키는지 알아보자.
1
python manage.py sqlmigrate polls 0001
위 명령어를 실행하면 아래와 같은 출력문이 나온다. 가독성을 위해 줄바꿈을 조금 수정함 ;)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
BEGIN; -- -- Create model Question -- CREATE TABLE "polls_question" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL ); -- -- Create model Choice -- CREATE TABLE "polls_choice" ( "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED ); CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id"); COMMIT;
이제 내부적으로 어떤 SQL이 작동하는지도 알았으니 migrate 해주자.
1
python manage.py migrate
위 명령어를 실행하면 아래와 같은 출력문이 나온다.
1 2 3 4
Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Applying polls.0001_initial... OK
admin 사이트에 모델 등록 (admin.py)
1 2 3 4 5 6
from django.contrib import admin from .models import Question, Choice # Register your models here. admin.site.register(Question) admin.site.register(Choice)
- 관리자 계정 만들기
1
python manage.py createsuperuser
- 관리자 페이지 접속해보기
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.