안녕하세요. 메타클라우드 입니다. 😁
패스트캠퍼스 챌린지 14일차 블로그 학습 정리 포스팅입니다.
학습 기록
지난번까지 Django의 Admin 페이지를 구성하고 Admin 페이지에 설문조사 앱을 구성하여 웹을 통해 작업할 수 있도록 실습을 진행하였습니다. 이번 포스팅은 Django의 View 기능에 대한 내용을 정리하였습니다. 패스트캠퍼스 14일차 수강 인증샷 입니다.
View (뷰) 추가하기
View(뷰)는 Django 어플리케이션이 일반적으로 특정 기능과 템플릿을 제공하는 웹페이지의 한 종류입니다. 예를 들어, 블로그 어플리케이션의 경우 다음과 같은 뷰를 가질 수 있습니다.
- Blog 홈페이지 – 가장 최근의 항목들을 보여줍니다
- 항목 《세부》(detail) 페이지 – 하나의 항목에 연결하는 영구적인 링크(permalink)를 제공합니다.
- 년도별 축적 페이지 – 주어진 연도의 모든 월별 항목들을 표시합니다.
- 월별 축적 페이지 – 주어진 월의 날짜별 항목들을 표시합니다.
- 날짜별 축적 페이지 – 주어진 날짜의 모든 항목들을 표시합니다.
- 댓글 기능 – 특정 항목의 댓글을 다룰 수 있는 기능
우리가 만드는 설문조사 앱(poll 어플리케이션)에서 다음과 같은 네개의 view 를 만들어 보겠습니다.
- 질문 《색인》 페이지 – 최근의 질문들을 표시합니다.
- 질문 《세부》 페이지 – 질문 내용과, 투표할 수 있는 서식을 표시합니다.
- 질문 《결과》 페이지 – 특정 질문에 대한 결과를 표시합니다
- 투표 기능 – 특정 질문에 대해 특정 선택을 할 수 있는 투표 기능을 제공합니다.
아래 Code를 polls/views.py 에 추가합니다. Code를 보면 아무것도 request가 없으면 index 페이지가 나오고 question_id 라는 값이 있으면 HttpResponse에 해당 값과 함께 페이지가 출력됩니다.
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
def test(request):
return HttpResponse("Hello, world. You're at the test index.")
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
그리고 views.py 코드에 따라서 urls.py 에서 path 도 바껴야 합니다. Code를 보면 path는 question_id가 int 값으로 추가가 됩니다. 추가가 되면 views.detail 함수를 호출하게 되어 있습니다. (views.results 랑 views.vote도 마찬가지 입니다.)
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
즉, path에 int 값 2를 넣으면 views.detail 함수로 넘어가서 브라우저 결과에 You're looking at question 2. 이라고 나옵니다. (아래 브라우저 화면을 참고하세요.)
View (뷰)가 실제로 뭔가를 하도록 만들기
저번 포스팅에서 생성한 Question고 Choice를 화면에 출력해보겠습니다. 우선 polls/views.py 코드를 아래와 같이 변경해줍니다. (기존 Code에서 index에 Question을 추가)
from django.http import HttpResponse
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_question_list])
return HttpResponse(output)
def test(request):
return HttpResponse("Hello, world. You're at the test index.")
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
그러면 아래와 같이 등록된 질문 2개가 나오는데 그냥 텍스트로만 나옵니다. 예쁘게 꾸며주기 위해서는 django의 템플릿을 사용하면 됩니다.
polls 디렉토리 안에 templates 디렉토리랑 polls 디렉토리를 만들고 index.html 파일을 아래 코드를 입력하여 생성합니다. index.html은 latest_question_list 값을 화면에 <ul>,<li> HTML형태로 for문을 통해 값을 출력합니다. 해당 값은 views.py에서 정의되어 있습니다. (django에서 for문 사용법이라고 이해...)
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
그리고 polls/views.py 에서 index 부분을 아래와 같이 수정합니다. loader 함수가 추가되고 template에 latest_question_list를 보여줍니다.
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
이전과 다르게 질문이 텍스트에서 하이퍼링크로 달리고 리스트 형태로 출력됨을 확인 할 수 있습니다. 질문이 2개 였기 때문에 index.html의 for문이 두바퀴 돈거라고 이해하시면 됩니다.
render() 를 사용하면 views.py를 좀 더 짧게 사용할 수 도 있다고 합니다. (아래 코드 참고)
from django.shortcuts import render
from .models import Question
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)
404 에러 일으키기
실제 데이터베이스에 값이 없으면 404 에러가 나오도록 할 수도 있습니다. views.py를 아래와 같이 수정하고
from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
polls/templates/polls/detail.html 파일을 아래와 같이 만듭니다.
{{ question }}
그러면 아래와 같이 결과 페이지가 아니면 404 에러가 발생합니다.
Details 페이지에 템플릿 사용하기
현재 디테일 페이지는 그냥 Question만 단순하게 텍스트로 보여주는데 거기에 템플릿을 사용해보겠습니다. 아래 코드를 detail.html에 입력합니다. 이전 포스팅에서 질문에 대한 선택리스트로 만든 리스트를 보여주도록 하겠습니다. (for 문 사용)
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
그러면 아래와 같이 Question에 대한 Choice 리스트를 확인 할 수 있습니다.
패스트캠퍼스 챌린지 14일차 포스팅을 여기서 마치며, 다음 포스팅에서는 백엔드 Django에서 사용자들이 실제로 웹을 통해 투표가 가능하도록 코드를 변경하는 강의를 듣고 실습내용을 정리하겠습니다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'DevOps > Fast Campus' 카테고리의 다른 글
[패스트캠퍼스 챌린지 16일차] - 백엔드 개발 1 (0) | 2021.11.16 |
---|---|
[패스트캠퍼스 챌린지 15일차] - 백엔드 Django 기초 3 (0) | 2021.11.15 |
[패스트캠퍼스 챌린지 13일차] - 백엔드 Django 기초 1 (0) | 2021.11.13 |
[패스트캠퍼스 챌린지 12일차] - 백엔드 Django 4 (0) | 2021.11.12 |
[패스트캠퍼스 챌린지 11일차] - 백엔드 Django 3 (0) | 2021.11.11 |