Django 04편 - polls app 구현하기 1편
포스트
취소

Django 04편 - polls app 구현하기 1편

이번에 django 공식 문서의 튜토리얼을 진행하면서 가능한 한 자세하게 다뤄볼 생각…

polls app을 만들어서 프로젝트에 붙이자!

  1. polls app 생성
    1
    2
    
    mkdir django_demo/apps/polls
    django-admin startapp polls django_demo/apps/polls
    
  2. 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',
    ]
    
  3. 테스트를 위한 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.")
    
  4. 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'),
    ]
    
  5. 프로젝트에 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')),
    ]
    
  6. 잘 작동하는지 테스트

    • 로그
    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)
    
  7. 파일 구조

사진

데이터베이스 사용해보기

  1. settings에서 타임존 설정하기
    1
    2
    
    TIME_ZONE = 'Asia/Seoul'
    USE_TZ = False
    
  2. 모델 만들기 (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
    
  3. 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
    
  4. 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)
    
  5. 관리자 계정 만들기
    1
    
    python manage.py createsuperuser
    
  6. 관리자 페이지 접속해보기 사진
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.