처음보는 Django 연습하기 [3단계]
- 템플릿 Html 파일 연결하기
- URL, View가 템플릿과 어떻게 연결 되는가?
뷰(View) - Django 웹의 로직을 담당한다. 웹에서 일어나는 데이터 저장, 파일 다운로드 등의 일을 처리한다.
프로젝트에서 View 만들어보기
4가지 View를 만들어보자.
1) Question 색인 페이지 : 최근 질문들을 표시한다.
2) Question 세부 페이지 : 질문 내용과, 투표할 수 있는 서식을 표시한다.
3) Question 결과 페이지 : 특정 질문에 대한 결과를 표시한다.
4) 투표 기능 : 특정 질문에 대해 특정 선택을 할 수 있는 투표 기능을 제공한다.
#polls/views.py 수정
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls 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)
request라는 인자를 받고 HttpResponse라는 함수로 return 한다.
고객에게 request를 받게 되면, 여러가지 정보를 request가 담게 된다. 이후 Respose를 return 해준다.
뷰(view.py)를 호출, 연결하기 위해서, urls.py를 수정해주어야 한다.
#polls/urls.py 수정
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'),
]
ex:/polls/
고객이 해당 주소를 호출하게 되면, ' ' 아무것도 없으므로 views.index가 호출 된다.
= 해당 주소로 view의 index가 호출이 된다. view.py에서 "Hello world"라는 문자열이 나타나게 될것이다.
ex:/polls/5
polls 다음에 question_id=5로 주소 뒤에 5를 전달해주었다.
veiw.py의 detail(상세 페이지)이 호출이 되고, "You're looking at question 5"라는 문자열이 나타난다.
ex:/polls/5/results/
ex:/polls/5/vote/
results 결과페이지 주소를 전달해주면, view.py의 results가 호출이 되고,
vote 결과페이지 주소를 전달해주면, view.py의 vote가 호출이 된다.
Hello World 대신 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)
Question 데이터 중 pub_date를 정렬하여 5개까지 가지고 온 후,
5개를 ' , '로 연결해준다. 문자열로 변경하여 return 해준다.
고객에게 보여주는 View를 일일이 고쳐주기에는 어렵다. Templates를 활용하여 쉽게 변경 할 수 있도록 만든다.
각 앱 별로 html파일을 설정해준다.
polls/templates/앱이름/index.html
{% 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 %}
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))
Render
render를 활용하면 loader,HttpRespose 없이 간단한 형태로 사용가능하다.
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 에러 일으키기
from django.http import Http404
from django.shortcuts import render
from .models import Question
# ...
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'polls/detail.html', {'question': question})