Django 003 | 공식문서 따라하기 #3

This Is Empty.·2021년 9월 9일
0

Django

목록 보기
3/20
post-thumbnail

🔗 Django 002 | 공식 문서 따라하기 #2에 이어서 작성된 포스트입니다.
🔗 첫 번째 장고 앱 작성하기, part 3 공식문서를 따라하며 작성된 글입니다.

첫 번째 장고 앱 작성하기, part 3

  • 어플리케이션에 뷰 추가하기

뷰는 Django 어플리케이션이 일반적을 특정 기능과 템플릿을 제공하는 웹페이지의 한 종류이다. Django에서 웹 페이지와 다른 콘텐츠들은 뷰에 의해 전달되며 각 뷰는 파이썬 함수로 표현된다. Django는 요청된 URL(도메인 이름 뒤의 URL)을 검사하여 뷰를 선택한다.

Django는 URL로부터 뷰를 얻기 위해 URLconf를 사용하고 URLconf는 URL 패턴을 뷰에 연결한다.

튜토리얼의 poll App은 다음 4개의 뷰를 생성한다.

  • Question(Index) 뷰 : 최근의 질문들을 표시
  • Question(Detail) 뷰 : 질문 내용과 투표할 수 있는 서식 표시
  • Question(Result) 뷰 : 특정 질문에 대한 결과 표시
  • Vote : 특정 질문에 대해 특정 선택을 할 수 있는 투표 기능

뷰 추가하기

뷰를 추가하기 위해 mysite/polls/view.py를 수정한다.

생성한 뷰를 호출하기 위해 mysite/polls/polls.urls를 다음과 같이 수정한다.

http://127.0.0.1:8000/polls/34로 접속하면 다음과 같은 화면을 볼 수 있다.

detail뷰가 polls/뒤의 question_id = 34를 인수로 받아 화면에 출력했다.

Django는 다음의 순서로 사용자가 요청한 페이지를 보여준다.

  1. 사용자가 웹사이트 페이지 요청
  2. Django : mysite.urls 모듈 호출
  3. mysite.urls에서 urlpatterns 변수를 찾음
  4. 일치하는 텍스트를 버리고 남은 텍스트를 <polls.url>URLconf로 전달해 남은 처리를 진행

위에서 본 polls/34/ 에 적용한다면 Django가 mysite.urls모듈을 호출 후 일치하는 텍스트인 polls/를 버리고 남은 텍스트인 34/를 URLconf로 전달해 남은 처리를 진행 한다. urlpatternspath('<int:question_id>/'...)와 일치하여 detail()뷰 함수가 호출되었다.

detail(request = <HttpRequest object>, question_id =34)

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

각 뷰는 두가지 중 하나를 하도록 되어있다.

  • 요청된 페이지의 내용이 담긴 HttpResponse객체를 반환
  • Http404와 같은 예외 반환

때문에 Django에게 필요한것은 HttpResponse객체 혹은 Exception이다.

다음의 코드는 index() 뷰를 호출했을때 시스템에 저장된 최소 5개의 투표 질문이 콤마로 분리되어 발행일 오름차순으로 출력된다.

질문을 추가해 index()뷰에 정의한 함수를 호출해보았다.

페이지의 디자인을 바꾸고 싶다면 polls디렉토리에 templates라는 디렉토리를 만든다. Django는 여기서 템플릿을 찾게된다.


TEMPLATES

🔗 Django - Templates


Django와 함께 사용할 모든 템플릿 엔진에 대한 설정을 포함하는 목록이다. 목록의 각 항목은 개별 엔진에 대한 옵션이 들어있다.

위 설정은 설치된 각 응용프로그램의 하위디렉터리에서 템플릿을 로드하도록 Django 템플릿 엔진에 지시하는 설정이다.


생성한 templates 디렉토리에 index.html파일을 생성하여 다음과 같이 입력한다.

다음으로 템플릿을 이용하여 polls/views.py의 index뷰를 업데이트 한다.

위 코드는 templates/polls/index.html 템플릿을 불러 온 후 context를 전달한다. context는 템플릿에서 사용되는 변수명과 python객체를 연결하는 사전형 값이다.

http://127.0.0.1:8000/polls/로 들어가면 저장된 질문 리스트들이 나온다(앞 전에 확인차 생성한 How R U today?질문은 삭제했기때문에 1개의 질문만 확인 가능하다)

shortcuts : render

템플릿에 context를 채워넣어 표현한 결과를 HttpResponse와 함께 돌려주는 구문은 자주 쓰인다. 때문에 Django에서는 이러한 기능을 쉽게 표현하기 위한 단축기능(shortcuts)을 제공한다.

index()뷰를 단축기능으로 작성하면 다음과 같다.

shortcuts를 모든 뷰에 적용한다면 더이상 loaderHttpResponse를 임포트 하지 않아도 된다. (하지만 detail, results, vote에서 stub(기존 코드를 흉내내거나 아직 개발되지 않은 코드를 임시로 대치하는 역할을 수행하는 함수)메소드를 가지고 있다면 HttpResponse를 유지해야 한다.


render()

🔗 Django - render
render(request, template_name, context=None, content_type=None, status=None, using=None)

render() 함수는 request객체를 첫번째 인수로 받고, 템플릿 이름을 두번째 인수로 받고 선택적으로 context 사전형 객체를 인수로 받는다. 인수로 지정된 context로 표현된 템플릿의 HttpResponse객체가 반환된다.

주어진 context 딕셔너리와 templete가 결합하여 HttpResponse객체와 렌더링 된 텍스트가 반환된다.
Django는 TemplateResponse를 반환하는 shortcut함수를 제공하지 않는다. TemplateResponse 생성자는 render()과 동일한 수준의 편의성을 제공하기 때문이다.

Required arguments

  • request : response를 생성하기 위해 사용되는 요청객체
  • template_name : 사용할 템플릿의 전체 이름또는 템플릿 이름의 순서. 시퀀스가 지정되면 존재하는 첫 번째 템플릿이 사용된다

404 Error 일으키기

다음의 코드는 요청된 질문의 ID가 없을 경우 Http404예외를 발생시킨다.

위 코드를 확인하기 위해 /templates/polls/에 detail.html파일을 생성하고 다음 내용을 작성한다.

{{question}}


존재하는 question_id를 사용할 경우 해당하는 question을 보여주지만


존재하지 않는 question_id를 사용하면 Http404 : Page not found를 발생시킨다.


shortcut : get_object_or_404()

🔗 Django - get_object_or_404()

get_object_or_404(klass, *args, **kwargs)

모델의 DoesNotExist예외가 발생하면 Http404를 발생시키지만 아니라면 get()함수를 호출한다.

Required arguments

  • klass : 개체를 가져올 인스턴스
  • **kwargs : 조회 매개변수. get()filter()에서 허용하는 형식이어야 한다.

다음과 같이 polls 어플리케이션에 적용시킬 수 있다.


템플릿 시스템 사용하기

템플릿 시스템은 변수의 속성에 접근하기 위해 점-탐색(dot-lookup)문법을 사용한다.

Django는 변수의 속성에 접근하기 위해 먼저 객체에 대해 사전형으로 탐색하고, 만약 실패하면 속성값으로 탐색한다. 만약 속성탐색에도 실패한다면 인덱스의 탐색을 시도한다.

위 코드의 question.choice_set.all은 python에서 question.choice_set.all()으로 해석되는데 이때 반환된 Choice객체의 반복자는 {% for %}에서 사용 가능하다.

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

하드코딩된 접근 방식은 많은 템플릿을 가진 프로젝트들의 URL수정을 어렵게 만든다.

이럴때 {% url %}template태그를 사용해 url설정에 정의된 특정한 URL경로들의 의존성을 제거할 수 있다.

  • 하드코딩된 URL

  • {% url %}template태그 사용

만약 detail뷰의 URL을 바꾸고 싶다면 templete이 아닌 polls/urls.py에서 바꾸어야 한다.

URL의 이름공간 정하기

튜토리얼에서는 polls 어플리케이션 하나만 가지고 진행했지만, 실제 프로젝트에서는 많은 앱이 포함될 수 있다. 이 앱들의 URL을 구분하기 위해서는 Django URLconf이름공간(namespace)를 추가해야 한다.

mysite/polls/urls.pyapp_name을 추가한다.

다음 polls/index.html내용을 이름 공간으로 나눠진 상세 뷰를 가리키도록 변경한다.

profile
Convinced myself, I seek not to convince.

0개의 댓글