갈루아의 반서재

설문에 대한 상세 내용을 보여주는 페이지를 다시 한 번 봅시다. 



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)을 유지하는 것이다.