본문 바로가기

프로젝트/파이썬 장고를 이용한 웹페이지 만들기

6. 튜토리얼 따라하기 - 설문조사(1)

https://docs.djangoproject.com/ko/3.0/intro/tutorial01/

 

첫 번째 장고 앱 작성하기, part 1 | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

을 참고함과 동시에 "배프의 오지랖 파이썬 웹 프로그래밍" 책을 참고하며 실습을 진행하고 있다.

 

1. 장고 프로젝트 생성하기

1.1. pycharm 에서 [File] - [New Project] 에서 새로운 프로젝트를 생성한다.

프로젝트 생성 및 설정

1.2. 장고 설치하기

다음을 입력하여 장고를 설치한다.

pip install django

1.3. 장고 프로젝트 생성

장고를 설치했으면, 장고 프로젝트를 생성한다.

django-admin startproject config .

1.4. 웹서버 시작하기

잘 생성되었는지 확인하기 위해 웹 서버를 시작해보자.

python manage.py runserver

만약, IP를 직접 지정하거나 같은 네트워크 망 안에서 접속이 가능하도록 하고 싶다면 다음 명령어를 입력하면 된다.

python manage.py 0.0.0.0:8000
python manage.py 0:8000

더 자세한 내용은 앞의 내용을 참고하길 바란다.

https://soy3on.tistory.com/57?category=738836

 

5. 관리자 계정 생성하기

장고의 장점 중 하나는 관리자 페이지 생성이 용이하다는 것이다. 이번에는 관리자 계정 생성을 해보겠다. 다음의 명령을 장고 프로젝트 터미널에 입력한다. python manage.py createsuperuser 계정명은 admin으로..

soy3on.tistory.com

그럼, 본론으로 돌아가서 설문조사 앱 생성을 본격적으로 시작해보겠다.


2. 설문조사 앱 생성하기

프로젝트도 만들고 서버 환경도 확인했으니 앱을 생성해보겠다.

python manage.py startapp polls

앱을 만들면 생기는 새로운 파일들을 확인할 수 있을 것이다.

startapp polls 결과

 

그럼, polls/views.py 파일을 열고 코드를 입력한다.

from django.http import HttpResponse


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

뷰를 생성하면 이 뷰를 호출하기 위한 URL이 필요하다고 앞서 말했을 것이다. URL 연결을 위해 polls 폴더에 urls.py 파일을 생성한다.

urls.py 생성

 

polls/urls.py 파일에 다음과 같은 코드를 입력한다.

from django.urls import path
from . import views


urlpatterns = [
	path('', views.index, name='index'),
]

path 함수는 path(route, view, kwargs, name) 형태로 호출한다. 즉, 총 4개의 다음과 같은 인수를 받는다.

  • route : 주소를 의미
  • view : route에서 지정한 주소로 접근했을 때 호출할 뷰
  • kwargs : 뷰에 전달할 값들
  • name : route의 이름을 의미. 이 이름을 가지고 원하는 곳에서 주소를 호출해 출력하거나 사용할 수 있음. 

polls 폴더에 있는 urls.py는 polls 앱의 라우팅만 담당한다. 프로젝트의 메인 urls.py 파일에서 연결을 해줘야 정상 동작하기 때문에, config/urls.py 파일을 다음과 같이 수정한다.

 

from django.confrib import admin
from django.urls import path, include


urlpatterns = [
	path('polls/', include('polls.urls')),
	path('admin/', admin.site.urls),
]

2.1. include()

include는 다른 urls.py 파일을 참조할 수 있도록 한다.

 

django가 함수 include()를 만나게 되면, URL의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include된 URLconf로 전달한다.

만약, 127.0.0.1:8000/polls/list/ 라는 주소로 접속하면 polls/ 까지는 일치하기 때문에 잘라내고 나머지 list/ 부분만 polls/urls.py 에서 찾아보는 방식으로 동작한다.

 

다른 URL 패턴을 포함할 때 마다 항상 include()를 사용해야 한다. 위에서 보는 것 처럼 admin.site.urls가 include()를 사용하지 않는 유일한 예외이다.

 

2.2. path()

path() 함수는 route, view의 필수 인수 2개와 kwargs, name의 선택가능한 인수가 필요하다.

- route 인수는 위의 'admin/'과 같은 인수로, URL 패턴을 가진 문자열이다. 요청이 처리될 때, django는 urlpatterns의 첫번째 패턴부터 시작하여 일치하는 패턴을 찾을 때 까지 요청된 URL을 각 패턴과 리스트의 순서대로 비교한다.

- view 인수는 django에서 일치하는 패턴을 찾으면 HttpRequest 객체를 첫번째 인수로 하고, 경로로 부터 캡처된 값을 키워드 인수로 해 특정한 view 함수를 호출한다

- kwargs 인수는 임의의 키워드 인수들을 목표한 view 에 사전형으로 전달한다.

- name 인수는 URL에 이름을 지으면, 템플릿을 포함한 django 어디에서나 이를 참조할 수 있게 된다. 이를 이용하게 되면, 단 하나의 파일만 수정해도 project 내의 모든 URL 패턴을 바꿀 수 있도록 해준다. 


터미널에 다음을 입력한다. 

python manage.py runserver

서버를 실행하고, 127.0.0.1:8000/polls/ 라는 주소로 접속한다. polls 앱의 첫 화면을 볼 수 있다.

/polls/ 접속

확인했다면, 다음 단계로 넘어가자.


3. 데이터베이스 생성하기

config/settings.py 를 열어서 76번째 줄을 살펴보자. 데이터베이스와 관련된 설정이 있을 것이다.

 

config/settings.py 76번째

 [ENGINE]은 어떤 종류의 데이터베이스를 사용할지 결정하는 부분이다. 기본적으로 다음과 같은 4가지를 사용할 수 있다.

  • django.db.backends.sqlite3
  • django.db.backends.postgresql
  • django.db.backends.mysql
  • django.db.backends.oracle

이 외에도 다른 데이터베이스도 사용할 수 있다. 원하는 데이터베이스의 사용법은 장고 메뉴얼이나 해당 데이터베이스 매뉴얼에서 찾아보면 된다.

 

데이터베이스를 만들고 초기화 하기 위해 아래 명령을 입력한다.

python manage.py migrate


4. 모델 생성

장고에서 모델은 데이터베이스의 구조도이다. 데이터베이스에 어떤 테이블을 만들고 어떤 컬럼을 갖게 할 것인지 결정한다. 또, 해당 컬럼의 제약 조건까지도 모델에서 결정한다. 이 모델은 보통 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)

장고의 모델은 [models.Model]을 상속받아 만든다. 이 부모 클래스가 실제로 데이터베이스와 ORM을 이용해 동작하는 기능들을 갖고 있다.

 

각 클래스 변수들은 필드 값을 가진다. 해당 필드는 자료형과 같다. 데이터베이스의 각 필드는 Field 클래스의 인스턴스로서 표현된다.

  • CharField는 문자(character)열 필드를 표현한다. 필수인자는 max_length로, 데이터베이스 스키마에서만 필요한 것이 아닌 값을 검증할 때도 쓰인다.
  • DateTimeField는 날짜와 시간(datetime) 형태를 표현한다. 사람이 읽기 쉬운 형태로 사용하고 싶다면 'date published'처럼 인자로 전달하면 된다.
  • default 인수는 기본값을 설정한다. 
  • ForeignKey는 다른 모델과의 관계를 만들기 위해 사용한다. 각각의 Choice가 하나의 Question에 관계된다는 것을 django에게 알려준다. 즉, Choice 모델이 Question 모델에 소속된다는 것을 의미한다.
  • django는 다대일(many-to-one), 다대다(many-to-many), 일대일(one-to-one)과 같은 모든 일반 데이터베이스의 관계들을 지원한다.

config/settings.py 파일을 열고 [INSTALLED_APPS] 변수 제일 윗줄에 polls 앱을 추가한다.

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

'polls.apps.PollsConfig'는 polls 앱 폴더에 apps.py 파일에 있는 PollsConfig 클래스를 의미한다.

짧게 쓰고 싶다면 [polls]라고 앱 이름만 써도 된다.

 

짧게 다른 설정들을 살펴보자

  • django.contrib.admin - 관리용 사이트를 의미
  • django.contrib.auth - 인증 시스템을 의미
  • django.contrib.contenttypes - 컨텐츠 타입을 위한 프레임워크
  • django.contrib.sessions - 세션 프레임워크
  • django.contrib.messages -  메세징 프레임워크
  • django.contrib.staticfiles - 정적 파일을 관리하는 프레임워크

4.1. 데이터베이스 적용하기

이제, 데이터베이스에 적용해보자. 다음을 터미널에 입력한다.

python manage.py makemigrations polls

makemigrations을 실행시킴으로서, 모델을 변경시킨 모든 이력을  migration으로 저장시키고 싶다는 것을 django에게 알린다. 명령을 실행하면 앱의 변경사항을 추적하고 파일을 생성한다. 이러한 파일들을 마이그레이션 파일이라고 한다. 각 파일은 번호가 하나씩 증가하며, polls/migrations/ 폴더에 순서대로 쌓인다.

makemigrations 명령 실행 결과

이제 어떤 SQL 구문이 실행될 지 확인해보자. 다음 명렁어(sqlmigrate)는 migration 이름을 인수로 받아, 실행하는 SQL 문장을 보여준다.

python manage.py sqlmigrate polls 0001

명령을 입력하고 실행하면 여러 줄의 SQL 구문이 나타난다. 이것을 보고 어떤 SQL을 실행할지 또는 문제가 있는 쿼리는 아닐지 판단할 수 있다. 하지만 장고를 사용하면 ORM을 통해 이런 쿼리문을 잘 모르더라도 웹 서비스를 구축할 수 있다. 자세한 쿼리문에 대한 설명은 각 데이터베이스의 설명문을 참고하자.

 

이제, 진짜로 변경사항을 데이터베이스에 반영하기 위한 명령을 입력하자.

python manage.py migrate polls 0001

이 명령을 실행하면, 데이터베이스에 테이블을 생성하고 초기화할 수 있다.


5. 모델에 함수 추가하기

이제 Question 모델과 Choice 모델에 [__str__] 메서드를 추가한다.

5.1. __str__ 메서드

클래스 내부에 __str__ 같이 _(언더바)가 앞뒤로 두 개씩 붙어있는 함수들을 매직 메서드 혹은 던더 메서드라고 부른다.

지금은 __str__ 메서드만 사용하니, 간단하게 알아보고 넘어가자.

__str__ 메서드는 클래스의 오브젝트를 출력할 때 나타날 내용을 결정해주는 메서드이며, 항상 문자열을 반환해야한다.


polls/models.py을 다음과 같이 수정한다.

import datetime

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


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    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

__str__() 메소드를 추가하는 이유는 객체의 표현을 대화식 프롬프트에서 편하게 보려는 이유와 django가 자동으로 생성하는 관리 사이트에서도 객체의 표현이 사용되기 때문이다.


5.2. was_published_recently 메서드 추가

다른 메서드도 추가해보겠다. [was_published_recently] 메서드를 추가하고 해당 메서드가 잘 동작하도록 datetime과 timezone도 import 해준다.

 

import datetime

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


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateField('date published')

    def __str__(self):
        return self.question_text
    
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
        
(후략)

모델을 작성한 후엔 단순 메서드의 변경은 위에서 한 migrate 명령을 내릴 필요가 없다.

다음은 관리자 페이지에서 모델을 확인해보자.


6. 관리자 페이지 확인

관리자 페이지에 접근하기 위해서는 관리자 계정이 필요하다.

 

https://soy3on.tistory.com/57?category=738836

 

5. 관리자 계정 생성하기

장고의 장점 중 하나는 관리자 페이지 생성이 용이하다는 것이다. 이번에는 관리자 계정 생성을 해보겠다. 다음의 명령을 장고 프로젝트 터미널에 입력한다. python manage.py createsuperuser 계정명은 admin으로..

soy3on.tistory.com

나는 기존에 생성했던 프로젝트를 토대로 진행하고 있기 때문에 관리자 계정이 이미 생성되어 있다. 하지만 관리자 계정을 생성하고자 한다면 위의 URL을 참고하면 된다.

 

또는 다음과 같이 터미널에 입력해준다.

python manage.py createsuperuser

관리자 계정을 생성하면 바로 서버를 실행해준다.

python manage.py runserver

서버를 동작시키고 웹 브라우저를 이용해 127.0.0.1:8000/admin/ 을 주소창에 입력해 관리자 페이지에 접속한다. 로그인 화면에서는 방금 만든 관리자 계정을 이용해 로그인한다.

로그인 한 후, 관리자 페이지에서 Question 모델을 관리하기 위해 등록을 해준다.

 

polls/admin.py파일에 다음과 같은 코드를 입력한다.

from django.contrib import admin
from .models import Question

admin.site.register(Question)

관리자 페이지에 모델을 등록하면 바로 확인할 수 있다.

모델 등록 후 관리자 페이지

새로운 투표를 등록하기 위해 Questions를 클릭한다. 클릭하면 투표 목록으로 이동할 수 있다.

 

투표 목록

투표 목록에는 아무 것도 없다. 위에 [ADD QUESTION] 을 클릭해 투표를 등록해주자.

투표 추가 후

투표를 추가하면 목록 화면에 투표 목록을 확인할 수 있다.

 

다음에는 더 많은 뷰를 추가해보겠다.