알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

django 404 에러 일으키기 본문

Web /Django

django 404 에러 일으키기

백곳 2017. 8. 12. 10:24

django 404 에러 일으키기 


polls/views.py

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
from .models import Question
from django.template import loader
from django.http import Http404

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})


여기서 해석을 해보면 

Question.objects.get(pk=question_id) 은

id 부분을 의미하게 됩니다. 


그래서 만약에 데이터 베이스 id 값에 없는 값을 호출할시에 404 페이지를 보내겠다는것입니다. 


detail(request,question_id) 의 question_id 은 


polls/urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^(?P$lt;question_id$gt;[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P$lt;question_id$gt;[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P$lt;question_id$gt;[0-9]+)/vote/$', views.vote, name='vote'),
]


여기서 url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), 에서 question_id에 값을 매칭 시켜 

detail(request,question_id) 의 question_id에 넣어 줍니다. 


그럼 http://10.23.10.232:8888/polls/1/ 을 호출 하게 되면 

question = Question.objects.get(pk=1)

http://10.23.10.232:8888/polls/2/ 을 호출 하게 되면 

question = Question.objects.get(pk=2)

가 됩니다. 


위에 데이터베이스 대로 라면 http://10.23.10.232:8888/polls/6/  Question.DoesNotExist가 발생하여 부터는 404 페이지를 띄울것입니다. 


return render(request, 'polls/detail.html', {'question': question}) 

을 충족 시키기 위해서 

polls/templates/polls/detail.html 파일을 만들어 줍니다. 

polls/templates/polls/detail.html 

{{ question }}


sudo service apache2 restart




위와 같이 데이터베이스 6이 없으니 에러가 뜨게 됩니다. 


이것 또한 자주 사용하다 보니 편리하게 사용하도록 함수를 제공 합니다. 


from django.shortcuts import get_object_or_404, render

# Create your views here.
from django.http import HttpResponse
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})


위와 같이 간단히 적어서 사용 하기도 합니다. 

Comments