티스토리 뷰

Backend-dev/python

views 파일에 class view 만들기

RunningWater 2018. 10. 20. 00:02

views 파일의 역할

앞 포스팅에서는 urls.py 파일을 만들었습니다. 해당 url에 설정된 뷰를 장고는 보여줍니다. 뷰는 어떤 역할을 할까요? 장고를 맨 처음 소개하며 말했듯이 뷰는 로직을 담당합니다. 데이터베이스를 변경할 것인 지 아니면 그냥 템플릿만 보여주면 될 것인 지를 정해서 사용자에게 맞는 템플릿을 보여줍니다.

IndexView 만들기

인덱스 뷰는 "localhost:8000/reading"에 연결됩니다. 저는 인덱스 페이지에서 제가 몇 권의 책이 있고, 몇 개의 좋은 글귀가 있는 지를 보여줄 예정입니다.


인덱스 페이지인덱스 페이지 입니다.


위와 같이 보여주려면 코드를 어떻게 구성해야 할까요?



우선 코드처럼 TemlpateView를 갖고오셔서 상속받으면 됩니다. 템플릿 뷰는 해당되는 템플릿만 보여주면 될 때 사용하는 클래스 뷰입니다. template_name에 우리가 사용할 템플릿을 지정하기만 하면 됩니다.


우리가 만들 페이지의 경우에 책과 글귀가 얼마나 있는 지 나타납니다. 해당 값은 Book과 Wisesaying 클래스에 있기 때문에 불러와서 콘텍스트에 넣었습니다.

장고의 컨텍스트(context)는 무슨 역할을 할까요?

데이터베이스의 값을 템플릿에서 사용하려면 뷰에서 값을 전달해야합니다. 그때 컨텍스트라는 형태로 템플릿에 값을 전달합니다. 책의 수와 글귀의 수를 변수에 담아서 context['data'] 안에 넣어서 context를 리턴하면 템플릿에서 data.book_num 또는 data.Wisesaying_num의 형태로 책의 수와 글귀의 수를 사용할 수 있습니다.

ListView와 DetailView 만들기

장고의 어려운 점이자 쉬운 점 중의 하나가 알아서 찾아서 하기 때문에 "갑자기 이게 왜 이러지?" 하게 생각하게 만든다는 것입니다. 



책의 리스트를 보여주는 뷰(localhost:8000/reading/book)와 그 책의 좋은 글귀를 보여주는 뷰(localhost:8000/reading/wisesaying/<int:pk>)는 해당 코드가 끝입니다. 너무 간단하게 정의했죠?


리스트 뷰책의 리스트를 보여주는 페이지입니다.


디테일 뷰책의 글귀를 보여주는 뷰입니다.


뷰는 저렇게 간단히 정의하고 템플릿만 신경쓰면 이와 같은 페이지들이 만들어집니다.

생략된 부분 생각해보기

우리는 model에 값만 전달했고, 컨텍스트, 템플릿 위치 등 아무것도 전달하지 않았습니다만 장고는 알아서 찾았습니다. 무슨 일이 일어난 것일까요?

우선 ListView를 상속받은 클래스는 모델이름의 소문자 형태에 "_list"를 붙여서 컨텍스트로 템플릿에 전달합니다. 그리고 모델명_list.html이라는 템플릿을 찾습니다. 즉 Book이라는 모델을 전달했으니 book_list라는 이름으로 템플릿에 컨텍스트를 전달하고 book_list.html이라는 템플릿을 찾습니다.

DetailView를 상속받은 클래스는 모델이름의 소문자 형태를 컨텐스트에 전달받고, 모델명_detail.html이라는 템플릿을 찾습니다. 즉 Wisesaying을 전달했으니 wisesaing이라는 이름으로 템플릿은 컨텍스트를 받고, wisesaying_detail.html이라는 템플릿을 찾습니다. 따로 템플릿을 지정하실거면 template_name에 템플릿을 지정해주시면 됩니다.

컨텍스트에 전달되는 모델명은 object로 쓸 수 있습니다. book_list도 되고, object_list도 인식합니다.


클래스 뷰는 많은 부분을 알아서 해주기 때문에 코드가 엄청 간결해집니다. 그 힘이 느껴지시나요?



다음 포스팅에서는 템플릿을 만들어보도록 하겠습니다.


'Backend-dev > python' 카테고리의 다른 글

django에 css 부분 추가하기  (0) 2018.10.21
django의 template 작성하기  (0) 2018.10.21
djanog urls파일 만들기  (0) 2018.10.19
reading 앱의 어드민을 커스텀 해보기  (0) 2018.10.18
reading 앱의 모델 정의하기  (0) 2018.10.18
댓글