Computer Science/Web

[Django] 장고 튜토리얼(3), 간단한 설문조사(Polls) 어플리케이션

hyunjin 2021. 5. 22. 01:17

Blog 뷰 예시

  • Blog 홈페이지 – 가장 최근의 항목들
  • 항목 《세부》(detail) 페이지 – 하나의 항목에 연결하는 영구적인 링크(permalink)
  • 년도별 축적 페이지 – 주어진 연도의 모든 월별 항목들을 표시
  • 월별 축적 페이지 – 주어진 월의 날짜별 항목들을 표시
  • 날짜별 축적 페이지 – 주어진 날짜의 모든 항목들을 표시
  • 댓글 기능 – 특정 항목의 댓글을 다룰 수 있는 기능

네개의 view 를 만들것임.

  • 질문 《색인》 페이지 – 최근의 질문들을 표시합니다.
  • 질문 《세부》 페이지 – 질문 내용과, 투표할 수 있는 서식을 표시합니다.
  • 질문 《결과》 페이지 – 특정 질문에 대한 결과를 표시합니다
  • 투표 기능 – 특정 질문에 대해 특정 선택을 할 수 있는 투표 기능을 제공합니다

URL로부터 뷰를 얻기 위해, Django는 'URLconfs’라는 것을 사용. URLconf는 URL 패턴을 뷰에 연결

 

뷰 추가하기

polls/views.py 에 뷰를 추가

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)

index를 지우지 않고 그냥 이렇게 추가하는게 맞는지 모르겠음.ㅎㅎ

 path()  호출을 추가하여 이러한 새로운 뷰를 polls.urls 모듈로 연결

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'),
]

브라우저에 《/polls/34/》 를 입력해 보세요. 이 주소에 접속하면 detail() 함수를 호출하여 URL 에 입력한 ID 를 출력할 것

《/polls/34/results/》 와 《/polls/34/vote/》 도 실행해 보세요. 투표 결과와 투표 페이지의 뼈대가 되는 페이지가 출력될

 

더보기

사용자가 웹사이트의 페이지를 요청할 때, 예로 《/polls/34/》를 요청했다고 하면, Django는 mysite.urls 파이썬 모듈을 불러오게 됩니다. ROOT_URLCONF 설정에 의해 해당 모듈을 바라보도록 지정되어 있기 때문입니다. mysite.urls에서 urlpatterns라는 변수를 찾고, 순서대로 패턴을 따라갑니다. 'polls/'를 찾은 후엔, 일치하는 텍스트("polls/")를 버리고, 남은 텍스트인 "34/"를 〈polls.urls〉 URLconf로 전달하여 남은 처리를 진행합니다. 거기에 '<int:question_id>/'와 일치하여, 결과적으로 detail() 뷰 함수가 호출됩니다

뷰가 실제로 뭔가를 하도록 만들기

 

각 뷰는 두 가지 중 하나를 하도록 되어 있습니다. 요청된 페이지의 내용이 담긴 HttpResponse 객체를 반환하거나, 혹은 Http404 같은 예외를 발생하게 해야합니다. 나머지는 당신에게 달렸습니다..

더보기

나중에 볼 용도로 코드까지 다 복붙해오고 싶었지만,, 너무많은 시간이 소요되어서 그만둔다..

나중에 봤을 때 가이드 정도만 되게 정리하려고 한다.

템플릿 만들기

지름길:render()

템플릿에 context 를 채워넣어 표현한 결과를 HttpResponse 객체와 함께 돌려주는 구문은 자주 쓰는 용법

from django.shortcuts import render

이거하면 loader와 HttpResponse를 임포트 안해도 된다고 함.

 

404 에러 발생시키기

요청된 질문의 ID 가 없을 경우 Http404 예외를 발생

 

지름길:get_object_or_404()

만약 객체가 존재하지 않을 때 get() 을 사용하여 Http404 예외를 발생시키는것은 자주 쓰이는 용법

get_object_or_404() 함수는 Django 모델을 첫번째 인자로 받고, 몇개의 키워드 인수를 모델 관리자의 get() 함수에 넘깁니다. 만약 객체가 존재하지 않을 경우, Http404 예외가 발생합니다.

 

 

템플릿 시스템 사용

템플릿에서 하드코딩된 URL 제거하기

URL의 이름공간 정하기

URLconf에 이름공간(namespace)을 추가하는 것입니다. polls/urls.py 파일에 app_name을 추가하여 어플리케이션의 이름공간을 설정할 수 있습니다.