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을 출력한다.
'Frameworks > Django' 카테고리의 다른 글
Django2.1 mysql 연동하기 (0) | 2019.03.15 |
---|---|
Django2.1 내가 보는 강의 tutorial 4 (0) | 2019.03.15 |
Django2.1 내가 보는 강의 tutorial 2 (0) | 2019.03.12 |
Django2.1 내가 보는 강의 tutorial 1 (0) | 2019.03.12 |
[Django] 설치하기 (0) | 2018.12.06 |
댓글