설문에 대한 상세 내용을 보여주는 페이지를 다시 한 번 봅시다.
polls/views.py
from django.shortcuts import render
from django.http import HttpResponse, Http404
from django.template import RequestContext, loader
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)
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})
def results(request, question_id):
response = "You're looking at the result of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on qeustion %s." % question_id)
# Create your views here.
위에서 해당 뷰는 요청한 질문의 ID가 없는 경우 Http404 예외를 일으키도록 한 것이다.
polls/detail.html 템플릿에 대한 내용은 이후에 다룰 것이지만, 실행 예를 보고 싶다면 아래와 같은 파일을 하나 만들면 된다.
polls/templates/polls/detail.html
{{ question }}
없는 질문 번호를 입력하면 아래와 같이 404 에러 메시지를 보여준다.
A shortcut: get_object_or_404()¶
get() 과 raise Http404 를 통해 해당 오브젝트가 존재하지 않음을 나타내는 방법이 있다. 역시 위와 마찬가지로 detail 을 아래와 같이 수정한다.
polls/views.py
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponse, Http404
from django.template import RequestContext, loader
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)
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
def results(request, question_id):
response = "You're looking at the result of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on qeustion %s." % question_id)
# Create your views here.
ObjectDoesNotExist 예외 말고 get_object_or_404() 함수나 Http404 에러를 나타내는 모델 API를 쓰는 이유는, 모델 레이어와 뷰 레이어를 결합시켜주기 때문이다. 장고의 가장 중요한 디자인 목표 중 하나가 느슨한 결합(loose coupling)을 유지하는 것이다.
'프로그래밍 Programming' 카테고리의 다른 글
[django] Namespacing URL names (0) | 2015.07.18 |
---|---|
[django] Use the template system (0) | 2015.07.18 |
[django] Write views that actually do something (0) | 2015.07.17 |
장고 URLS 에서 달러($)와 캐럿(^)이 의미하는 것은? (0) | 2015.07.17 |
[django] Writing more views (0) | 2015.07.17 |