Django2.1 내가 보는 강의 tutorial 3

Frameworks/Django|2019.03.14 22:34

Django2.1 내가 보는 강의 tutorial 3


6. 앱 만들기

현재 이 프로젝트는 설문조사를 하는 사이트로 다양한 기능을 필요로 할 것이다. 

설문을 받는 기능, 통계를 보는 기능 등 다양한 기능을 가져야 한다. 

각 기능들에 대해 분리해놓은 것을 앱으로 볼 수 있다.

이 프로젝트에서는 설문받는 기능의 polls앱만 생성한다.

$ python manage.py startapp polls 
다음과 같이 polls라는 디렉토리 안에 앱에 필요한 파일들이 자동으로 생성된다. 



admin.py - polls라는 앱의 데이터를 관리하기 위한 admin페이지를 설정하는 파일.

models.py - polls에서 사용할 데이터들을 정의하는 파일.

views.py - 어떤 데이터를 이용하여 어떤 방식으로 사용자에게 보여줄지 설정하는 파일.

현재 urls.py 파일이 빠져있고, 템플릿파일이 없다. 기본적으로 생성해주지 않는다. 

일단 모델과 뷰를 설정한 뒤 생성한다.

7. 앱 등록하기

앱을 생성했다면 앱을 사용하기 위해 config/settings.py에 앱을 사용하겠다고 등록을 해줘야 한다.

config/settings.py 파일을 열어보면 

아래와 같은 부분이 있다. 

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


여기에 맨 마지막에 'polls', 를 추가해 준다.


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

다음에 앱이 더 추가될 수 있기 때문에 콤마( , )를 꼭 쓰자.


8. 모델 만들기

polls/models.py 에 코드를 추가한다. 

설문조사 데이터로 쓸 'Question' 모델과 선택지 데이터로 쓸 'Choice' 모델을 만든다.

각 모델은 models.Model 클래스를 상속받아 생성한다.

클래스이름은 데이터베이스의 테이블 명이 되고, 

각 변수들은 컬럼이 된다. 

models에 들어있는 필드생성메서드를 사용하여 컬럼으로 쓰일 변수들을 생성한다.

models.CharField()는 문자열 데이터를 저장할 필드를 생성하고, 

 max_length 에는 최대 문자길이를 설정해준다.

models.DateTimeField()는 날짜형태의 데이터를 저장할 때 쓰는 타입의 필드 생성한다.

 auto_now_add를 True로 지정하면 데이터가 저장될 때 자동으로 현재 시간을 넣어준다.

models.IntegerField()는 숫자형 데이터 필드를 만든다.

models.ForeignKey()는 외래키로 선택지가 어느 질문의 선택지인지 연결하는 역할을 하는 필드이다.

 연결시킬 모델을 지정해주며, on_delete=models.CASCADE 는 연결되어 있던 질문지가 삭제되었을 때 선택지도 같이 삭제하라고 설정해주는 항목이다.

from django.db import models

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField(auto_now_add=True)

class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)


python manage.py makemigrations
python manage.py migrate


실행하고 나면 아래와 같이 

앱이름_모델클래스이름 으로 테이블이 생성된다.



모델 클래스에 필드를 받아 명시한 변수는 테이블 안에 컬럼으로 생성된다.




9. 뷰 만들기

일단은 첫화면에 질문지 리스트를 보여주는 페이지만 만들어 본다.

latest_question_list라는 변수에 Question 모델의 데이터를 담아 반환한다.

Question 모델을 사용하여 데이터를 가져와야 하고, 이를 pub_date필드로 정렬하며 다섯개의 데이터만 불러오겠다는 의미이다. 

불러온 데이터를 파이썬의 딕셔너리 자료형으로 만들어 템플릿으로 보낸다.

딕셔너리 자료형은 키와 값의 쌍으로 템플릿에서 키를 이용해 값을 사용할 수 있다.

render()에 첫번재 인자로 request, 두번째 인자로 템플릿, 세번재 인자로 가져온 모델을 넣어준다.

그리고 이를 반환한다.

from django.shortcuts import render
from .models import Question, Choice

def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)


10. 템플릿 만들기

앱에서 사용할 템플릿은 Django의 규칙에 따라 앱 디렉토리에 

templates 이라는 이름의 디렉토리를 만들고 그 안에 html파일을 만들어 넣어주어야 인식할 수 있다.

templates 아래에 앱이름과 동일한 polls라는 디렉토리를 만들고 이안에 index.html을 만들어준다.

polls 디렉토리를 또 만드는 이유는 후에 제네릭뷰를 사용하기 위함이다.

뷰에서 polls디렉토리에 index.html 파일을 템플릿으로 사용한다고 명시했다.



index.html에 다음과 같이 코드를 넣어준다.

{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li>{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}

{% %} 과 {{ }}는 템플릿 문법이라 하며 파이썬에서 사용하는 특별한 규칙이다.

템플릿 문법을 사용하여 명령과 데이터를 조작할 수 있다.

{% %} 에서는 반복문, 분기문 등의 로직을 조작할 때 사용하고

{{ }} 는 변수를 호출할 때 사용한다.

뷰에서 템플릿으로 데이터를 넘겨줄 때 

context = {'latest_question_list': latest_question_list} 이런식으로

'latest_question_list' 라는 이름으로 데이터를 넘겼다. 

템플릿에서 이 이름을 바로 객체로 사용할 수 있다.

latest_question_list에 데이터가 있으면 Question 모델의 quetion_text를 <li>태그안에 출력하고

데이터가 없으면 No Polls are available을 출력하라는 코드이다.


11. URL 연결하기

기본 개발용 서버를 이용하면 localhost(127.0.0.1)의 8000포트에서 배포된다. 

이때 127.0.0.1:8000으로 접속하면 Django는 제일 처음 config디렉토리의 urls.py에서 

patterns에 들어 있는 내용을 참고하여 어느 페이지로 갈지 판단하게 된다. 

이때 polls앱으로 이동해야 하니 다음과 같이 path()에 polls라는 URL을 지정해 준다.

즉, 127.0.0.1:8000/polls/ 라는 URL로 접근하게 되면

polls의 urls.py 파일을 포함하겠다는 의미이다. 

urlpatterns에 path('polls/', include('polls.urls')), 를 추가해준다.

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

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

urls.py는 앱을 생성할 때 기본적으로 생성되지 않는다.

polls디렉토리에 urls.py를 생성해준다.



다음 코드를 넣어준다.

from django.urls import path
from . import views

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

Django는 urls.py에서 urlpatterns 안에 들어 있는 path 메서드의 내용을 확인하여 URL을 매칭시킨다.

path() 의 첫번째 인자는 route로 URL패턴을 가진 문자열이 들어간다. 현재 첫화면에 보여주기 때문에 빈칸으로 넘겨준다. 

두번째 인자는 일치하는 패턴을 찾으면 해당 URL에 나타내줄 뷰를 지정한다.

세번째 인자의 name은 템플릿에서 쓸 URL패턴의 이름이다. 

이는 다음에 활용 방법을 볼 것이며 일단 이정도까지만 하고 서버를 실행시켜 확인해본다.


$ python manage.py runserver

서버를 실행해 놓고 127.0.0.1:8000/polls/ 로 접속해본다.



템플릿에서 지정한대로 데이터가 없으므로 No polls are available을 출력한다.

댓글()