본문 바로가기

Tech/[Backend] Django

Django 공식 문서로 Django 입문하기 (3) - Vote 앱 개발하기

해당 게시글에서 사용한 코드는 아래 Github 에서 확인할 수 있다.

 

GitHub - baobabnamu/goormthon: Monolithic Repositories About Goormthon Missions, Study, Lecture

Monolithic Repositories About Goormthon Missions, Study, Lecture - baobabnamu/goormthon

github.com

 

 

Polls 앱을 위한 detail, results, vote View 개발

  • 템플릿 개발 전이므로 HttpResponse 객체에 문자열만 담아서 반환하도록 함

 

URLconf 설정을 통해 View 와 매핑

  • 들어오는 HTTP 요청의 URL를 분석해 적절한 View 로 전달
  • URL를 분석 과정에서 적절하게 파라미터 등을 변환 시켜줌

 

매핑이 확인됐으면 View 함수에서 사용할 Template 작성

  • index view 에서 반환할 index.html 파일 생성
  • Template Engine 에서 해석할 수 있는 코드 작성
  • 다시 views.py 의 index view에서 해당 템플릿을 사용할 수 있도록 수정
  • 둘 다 동일한 동작이지만, 아래와 render 함수를 사용하면 깔끔한 코드 작성 가능
  • 아래와 같이 템플릿 엔진으로 DB에 저장되어 있는 값을 불러올 수 있어야 함.

이번에는 Detail View에 대한 내용을 수정

  • View 에서 처리할 수 있는 예외는 view에서 처리하고, model과 관련된 예외는 model에서 처리하도록 구현.
  • 쉽게 말해, HTTP 404 Error 는 템플릿의 위치가 잘못되는 등의 오류로, 해당 오류는 view 의 책임임. 책임에 맞는 느슨한 결합을 지향해야 함.

 

detail.html 생성

 

아래와 같이 http://127.0.0.1/polls/1 접속 시 페이지 확인이 가능해야 함.

  • 흐름 : 프로젝트에 있는 URLConf에 의해 polls 앱으로 전달되고, 해당 polls 앱의 View를 반환한다. 이때, view는 template 으로 구성된 html 을 불러오며, template 엔진은 동적으로 DB에 있는 값을 HTML 에 새긴다. 이후 이를 View가 전달하는 방식임.

index.html 에 작성된 하드코딩 종속성 제거

{% url 'detail' question.id %} 에 대한 설명

  • {% %}: Django 템플릿 태그를 나타냄
  • url: URL 생성 템플릿 태그
  • 'detail': urls.py에서 정의한 URL 패턴의 name
  • question.id: URL 패턴에 전달할 파라미터
  • 결과적으로 /polls/질문ID/ 형태의 URL을 생성

{{ question.question_text }} 에 대한 설명

  • {{ }}: Django 템플릿 변수를 나타냄
  • question: 뷰에서 전달받은 Question 객체
  • question_text: Question 모델의 필드값

 

즉 아래 지정된 urlpatterns name을 참조함.

 

Django의 특성상 서비스 별로 다양한 앱을 생성해서 플러그로 꽂아 개발을 진행해야 됨.

이때 앱 간의 URL 이름을 구분하기 위해서 네임 스페이스를 사용함.

urls.py 에서 app_name 추가

 

index.html 에서 네임스페이스를 활용해서 detail URL 라우팅하기.

 

본격적으로 Template 엔진 활용

 

vote view 작성

 

detail.html 수정

 

Result view 작성

 

results.html 작성

 

아래와 같이 정상적으로 투표가 되는지 확인

 

General View를 활용한 코드 라인 줄이기

URLconf 수정

 

views.py 수정

  • vote 함수 제외 모두 수정.

 

코드 변경 전과 동일하게 vote 함수 동작과 vote template, result template 이 정상적으로 동작하는지 확인.