Django를 이용한 설문조사 앱 만들기 part.1

2022. 1. 11. 17:32Django

이 전 시간에 우리는 어떻게 장고를 설치할 것인지를 배웠다. 이제는 조금 더 나아가도록 하자. 장고를 이용하여 설문조사를 할 수 있는 어플리케이션을 구축하고자 한다. 그러기 위해서는 python manage.py startapp polls(polls대신 사용자가 원하는 이름을 기입해도 상관없다.) 라는 명령어를 사용해 새로운 앱을 설치하도록 하자.

그럼 다음과 같이 polls라는 폴더와 각종 py파일이 설치된 것을 확인할 수 있을 것이며 주요 py는 다음과 같다.

admin.py 관리자 개념이다.
models.py  모델==데이터베이스 라고 생각하면 편하다. 실질적으로 DB에 접근하기 위해서 장고에서는 이 안에 class형태로 DB를 형성하고 실행한다.
views.py  실제 사용자가 하는 행동, 알고리즘, 로직들을 관장하는 폴더다.

 

이제 views에 다음과 같은 명령어를 입력한다.

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

 

*# 이하의 주석은 설명을 위한것이니 코드 복붙을 하려면 반드시 주석을 지워야 한다.

그 다음으로는 mysite의 urls.py을 다음과 같이 변경한다.

from django.contrib import admin
# path, include내용을 추가
from django.urls import include, path

urlpatterns = [
    #기존 urls.py에 path('polls/', include('polls.urls')),
    #라는 명령어를 추가한 것 뿐이다.
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

이 후 다시 터미널에 runserver를 입력한 후 http://127.0.0.1:8000/로 들어가 보자. 와 센즈 정말 놀랍습니다. 가 아니라 갑자기 404 에러가 나타나며 페이지를 찾을 수 없다고 나타난다. 이게 머슨129..? 이겠지만 너무 당황하지 말고 주소창 뒤에 우리가 금방 만든 폴더명인 polls를 입력해 주자.

polls가 아닌 다른것으로 만들어도 그 이름 그대로 붙이면 되기에 상관없다.

 

자 이 상황에서 PC는 어떻게 작동되는가에 대한 간단한 로직을 알아보자.

 

1. 먼저 PC는 리퀘스트를 받는다.(127.0.0.1:8000포트의 polls라는 url로 가라)

2. 전체적으로 mysite파일 안의 url로 접속한다.

3. 명령어 path('polls/', include('polls.urls')), 를 봤을때 polls/라는 형식을 가진 리퀘스트의 경우 polls.url로 보내버려라. 라는 것을 확인할 수 있다.

4. polls 안에 금방 만든 urls.py로 접근을 했을때 이 안에는 다음과 같은 명령어가 있음을 알 수 있다. path('', views.index, name='index'),

공백, 즉 ''(polls/ 뒤에 아무것도 없을 때)에는 views.index라는 함수를 호출해서 응답값으로 줘라 라고 되어 있다.

5. views.py 에 있는 함수인 index라는 함수를 통해 response가 된다.

 

자 이제 어떻게 구현되는지 알았으니 본격적으로 시작해 보도록 하자. 먼저 마이그레이션을 하도록 하자. 아래의 명령어를 입력하면 된다.

python manage.py migrate

뭔가 쭉쭉 지나가며 OK가 계속 나타날것이다. 길어봤자 5초안에 다 해결되니 그 다음은 모델을 형성하자. polls안의 mobels.py(클레스를 정한 후 CRUD(생성,읽기,수정 혹은 갱신,삭제,를 할 수 있는 공간)에 다음과 같은 코드를 작성하자.

from django.db import models

#질문에 대한 DB가 형성된다.
class Question(models.Model):
#models라는 클레스의 Model을 상속 받는다.
    question_text = models.CharField(max_length=200)
    #DB에서 스키마(열)을 생성한다.최대 길이는 200까지.
    pub_date = models.DateTimeField('date published')
    #pub_date라는 필드의 형태는 datetime, 즉 언제 퍼블릭이 되는가

#선택(응답)에 대한 DB가 형성된다.
class Choice(models.Model):
    #외래키. 즉 하나의 질문 안에 여러가지의 선택지가 나타난다.
    #1번 question이 삭제되면 그 연관된 선택지도 다 삭제가 된다는 의미이다.
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    #choice라는 케릭터, 최대길이는 역시 200이다.
    choice_text = models.CharField(max_length=200)
    #각각의 초이스에 대한 투표. 기본적으로 int값이며 기본값으로 0(아무도 투표안함)을 준다.
    votes = models.IntegerField(default=0)

이 후 mysite의 settings.py의 33번 줄에 있는 INSTALLED_APPS = [... 'polls.apps.PollsConfig' 라는 명령어를 추가 해 주자. 

python manage.py makemigrations polls

migrations라는 폴더와 0001_initial.py라는 폴더가 생긴것을 확인할 수 있다. 이 후 다시 아래의 명령어를 실행하도록 하자. db.sqlite3 의 데이터로 스키마를 만들어 달라는 명령어 이다.

python manage.py migrate

이제 만든 데이터를 시각화하여 확인해 보도록 하자. shell 스크립트를 작성하기 위한 명령어를 입력해 보자.

python manage.py shell

polls.models 를 import 해 보도록 하자

from polls.models import Choice, Question

그 다음 Question 테이블에 어떤 object가 있는지 확인 하기 위한 명령어를 입력해보자. 지금은 아무것도 입력하지 않았기에 따로 나타나는것이 없다.

Question.objects.all()

이제 데이터를 입력해 보도록 하자. 두 가지 명령어를 쳐야하는데 순서대로 입력하자.

from django.utils import timezone
q = Question(question_text="What's new?", pub_date=timezone.now())

Question 데이터는 what's new 라고 입력할 것이고 pub_data는 지금으로 지정한 후 저장 하도록하자. 저장은 아래의 명령어 이다.

q.save()

자 이제 잘 저장되었는지 눈으로 확인해 보자.Question.objects.all() 명령어를 입력하면 object가 1개 들어가 있는것을 확인할 수 있다. q.id 값과 q.question_text, q.pub_date의 값도 잘 적용된 것을 확인할 수 있다.

question_text의 값을 변경하고 싶으면 그냥 현 상황에서 그대로 q.question_text="변경단어" 이라고 입력하면 된다.

그런데 Question object (1) 이라고만 되어있으면 우리가 넣은 object의 값이 최초입력값인지 변경된 값인지 알 턱이 없다. 가시성을 확보하기 위해 그렇기에 polls의 models.py에 하나의 함수를 추가해 보도록 하자. Question 함수에는 question을, Choice함수에는 choice를 추가하자. __str__ 이라는 함수를 추가하는것이다. 

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

변경한 후 쉘 스크립트를 다시 실행하자.

exit() 명령어를 입력해 스크립트를 종료후 다시 입장하여 확인해 보자. 잘 변경된것을 확인할 수 있다.

이제 datetime 이라는 메소드를 추가해 보자. timezone을 기준으로 언제 만들어졌는지 확인하는 명령어 이다.

import datetime

from django.db import models
from django.utils import timezone


class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

이 후 쉘 스크립트를 종료 후 다시 실행해 보자.

q = Question.objects.get(pk=1) =pk값이 1인 데이터를 q에 저장하겠다

>>> Question.objects.get(pk=1) pk값이 1 인 데이터는 무엇인가?
<Question: chichi> 값=chichi

가운데 q.was_published_recently 만 입력하니 오류가 나타났다..()는 필수다.

이런 느낌으로 자유롭게 함수를 만들고 데이터를 넣고 뺄 수 있다.

다음시간에는 admin과 다양한 url을 만들어 보도록 하자.