Python Django 기초 제 3강

서유상·2019년 12월 14일
1

Django

목록 보기
3/4
post-thumbnail

3 설문조사 앱 만들기

3.1 설문조사 앱 생성

python3 manage.py startapp polls 명령어를 입력합니다.

그러면 polls directory 안에 다음과 같이 새로운 파일들이 생성된 것을 볼 수 있습니다.

.
./tests.py
./migrations
./migrations/__init__.py
./models.py
./admin.py
./views.py
./apps.py

첫 번째 View를 만들어보겠습니다.

polls/views.py를 다음과 같이 수정해봅시다.

#/polls/views.py
from django.http import HttpResponse
def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

그리고 그 이후에 이 View를 호출하기 위한 URL이 필요하기 때문에 polls directory안에 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)형태로 호출합니다.

route : 주소를 의미합니다.
view : route주소랑 일치할 때 호출할 view
kwargs : view에 전달할 값들입니다.
name : route의 이름을 의미합니다.

polls 폴더에 있는 urls.py는 앱의 라우팅만 담당합니다.

프로젝트의 메인 urls.py파일에서 연결을 해줘야 정상 동작합니다.

/config/urls.py 파일을 다음 코드처럼 수정합니다.

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

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

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

만약 127.0.0.0:8000/polls/list/라는 주소로 접속하면

polls/까지는 일치하기 때문에 잘라내고

나머지 list/ 부분만 polls/urls.py에서 찾아보는 방식으로 동작합니다.

python3 manage.py runserver 명령어를 입력해줍시다.

실행 후에 서버주소:8000/polls/라는 주소로 접속하면

polls 앱의 첫 화면을 볼 수 있습니다.


3.2 데이터베이스 만들기

/config/settings.py를 열어서 76번째 줄을 봅시다.

데이터베이스 관련 설정이 있습니다.

이번에는 Maria DB로 설정할 것이기 때문에 그것에 맞춰서 settings.py를 맞춰보겠습니다.

#/config/settings.py
DATABASES = {
	'default': {
    	'ENGINE':'django.db.backend.mysql',
        'NANE':'DB이름',
        'USER':'사용자명',
        'PASSWORD':'비밀번호',
        'HOST':'DB주소',
        'PORT':'포트번호',
        'OPTIONS':{
        	'init_command':'SET sql_mode="STRICT_TRANS_TABLES"'
        }
}

이렇게 변경해주시면 됩니다.

참고로 Database의 Character set을 설정한대로 Django의 Character set도 설정되므로

이 부분 유의해주시길 바랍니다.

Database Default Character set도 변경해주셔야합니다.

Character set 문제 해결 하루종일한 필자 올림

그러면 이제 python3 manage.py migrate 명령어를 입력해주면 Django와 연동하기 위해서

Maria DB에 필요한 SchemaTable이 생성됩니다.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying sessions.0001_initial... OK

일반적으로 데이터베이스 설정이 끝난 직후에 실행하는 명령입니다.

기본적인 설정을 적용하기 위해서 실행했으니,

앱에서 사용할 모델을 작성하겠습니다.


3.3 모델 만들기

Django에서 모델은 데이터베이스의 구조도입니다. 다른 말로 Schema라고도 합니다.

Django에서 모델 구조를 정의하기 위해서는 ORM을 사용합니다.

ORM이란 데이터를 다루는 RDBMS 와의 상이한 시스템을 매핑하여,

데이터 관련 OOP 프로그래밍을 쉽게 하도록 도와주는 기술이라고 간단하게 알고 계시면 됩니다.

그럼 이제 모델을 한 번 설계해보겠습니다.

/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)

Django의 모델은 models.Model을 상속받아 만듭니다.

이 부모 클래스가 실제로 데이터베이스와 ORM을 이용해 동작하는 기능들을 가지고 있습니다.

각 클래스 변수들은 필드 값을 갖습니다. 해당 필드는 자료형과 같습니다.

CharField는 문자열 타입입니다.

DateTimeField는 날짜와 시간 형태입니다.

사람이 읽기 쉬운 형태를 사용하고 싶다면 date published처럼 인자로 전달하면 됩니다.

제약 조건을 결정하고 싶다면 max_length=200처럼 인자로 전달합니다.

ForeignKey는 다른 모델과의 관계를 만들기 위해서 사용합니다.

여기서는 Choice모델이 Question모델에 소속된다는 것을 의미합니다.

모델을 완성했으니 데이터베이스에 적용해야합니다.

migrate 명령을 사용하려면 polls앱을 현재 프로젝트에 연결시켜줘야 합니다.

/config/settings.py파일을 열고 [INSTALLED_APPS]에 polls 앱을 추가합시다.

#/config/settings.py
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

이제 데이터베이스에 적용해보겠습니다.

python3 manage.py makemigrations polls 명령을 입력해봅시다.

그러면 결과로 /polls/migrations/0001_initial.py 파일을 볼 수 있습니다.

이 파일을 데이터베이스에 적용하려면

python3 manage.py migrate polls 0001을 실행해주시면 됩니다.


3.4 모델에 함수 추가

Question 모델과 Choice모델에 메서드를 추가해보겠습니다.

#/polls/models.py
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
    def was_published_recently(self):
        return self.pub_date>=timezone.now() - datetime.timedelta(days=1)


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를 하지 않아도 정상 작동합니다.


오늘 준비한 게시물은 여기까지 입니다!

이 다음 게시물부터는 실제로 관리자 페이지 만들기를 진행해보겠습니다.

부족한 글 읽어주셔서 감사합니다.

더 좋은 내용으로 채울 수 있도록 노력하겠습니다. ^-^

profile
email - vlvksbdof123@naver.com

3개의 댓글

comment-user-thumbnail
2019년 12월 15일

개인적인 생각인데, django는 orm부분이 특히 강려크한것 같습니다 ^_^

1개의 답글