이 글은 [파이썬 웹 프로그래밍](저자 김석훈, 출판사 한빛미디어) 교재를 보고 공부하며 정리한 글임.
books라는 애플리케이션을 만들어 보자(주로 클래스형 뷰를 사용할것.)
애플리케이션을 만들려면 상위에 더 큰 개념인 프로젝트를 먼저 만들어야 한다-> 3장에서 사용했던 mysite 프로젝트를 그대로 사용
순서는
- 애플리케이션 설계
- 프로젝트 뼈대 생성
- 애플리케이션 model 코딩
- 애플리케이션 URLconf 코딩
- 애플리케이션 View 코딩
- 애플리케이션 Template 코딩
5.1.1 애플리케이션 설계하기
books 애플리케이션은 책, 저자, 출판사의 정보를 관리하는 웹 애플리케이션
index.html 에는 책, 저자, 출판사 중에 고를수 있고
책을 선택해서 들어가면 book_list.html 에서 책의 목록을 볼수 있으며
책을 한권 선택해서 들어가면 book_detail.html에서 책에 대한 정보를 볼 수 있다.
테이블은 Book, Author, Publisher 이렇게 3개 이고 각각 테이블마다 컬럼들이 여러개 들어있다.
5.1.2 프로젝트 뼈대 만들기 - 애플리케이션 추가
mysite 라는 기존의 프로젝트 사용하기 때문에 뼈대는 이미 만들어져 있는 것임.
books 애플리케이션만 추가하면 된다.
books 애플리케이션은 mysite 라는 프로젝트에 포함되는 거니까 설정파일에 등록을 해야한다.
books 애플리케이션을 settings.py에 등록해보자
그럼 이제 할일이..
-테이블 정의하기
-테이블들을 admin에 보이도록 함
-데이터베이스에 변경이 필요한 사항을 추출
-데이터베이스에 변경사항을 반영
-작업한 것 개발용 웹서버로 확인 이다
models.py 에 테이블 정의부터 해보자
5.1.3 애플리케이션 - Model 코딩하기
Book, Author, Publisher 이라는 테이블 세개를 코딩해줬다.
여기서 잠깐 정리하자면
테이블 간 관계를 나타내는 필드(3가지)
ForiegnKey : N:1
ManyToManyField : N:N
OneToOneField : 1:1
Book테이블과 Author 테이블은 N:N 관계이기때문에(저자는 여러명일 수 있고, 한 저자가 책을 여러권 쓸 수도 있으니) ManyToManyField를 썼고
Book 테이블과 Publisher 테이블은 N:1 관계로 묶어주려고 ForeignKey 를 썼다
주의할 점은 ForiegnKey 써줄 때에는 on_delete 옵션을 필수로 지정해야한다.
상대 테이블의 레코드가 삭제될 때 어떤 동작을 할지 정하는 건데
CASCADE 옵션의 의미는 publisher 테이블의 레코드가 삭제되면 그에 딸린 Book 테이블 레코드도 삭제한다는 의미이다.
이제 테이블을 만들었으니 admin 사이트에도 등록을 해보자
지금 정의했던 테이블을 데이터 베이스에 반영하자
잘 반영이 되었는지 admin 사이트에 가서 확인해야겠다. runserver를 실행시켜보자
Books 애플리케이션에 만든 테이블들이 잘 반영되어있다.
5.1.4 애플리케이션 - URLconf 코딩하기
뷰의 내용을 생각하면서 URLconf 를 정의하면 되는데
mysite/urls.py와 books/urls.py 이렇게 2개 파일에 코딩하면 됨
일단 mysite/urls.py 파일에 books 앱의 URL 설정 불러오는 내용을 추가하자
그 다음에는 books/urls.py
books 라는 애플리케이션 처음에 book 이랑 author 랑 publisher 도 선택할 수 있으니까 URL 다 고려해서 정의해준다
7개의 URL을 만들어주었다.
-> 또, 그에 해당하는 클래스형 뷰도 만들어준거다.(as_view() 메소드로 지정해주었으니까)
이에 따른 템플릿도 7개가 필요하겠지
하나의 뷰에서 여러개의 html 파일을 사용할 수 있고
하나의 html 파일을 여러개의 뷰에서 사용할 수도 있다.
항상 일대일 관계는 아니라는 말이다.
5.1.5 애플리케이션 - 클래스형 View 코딩하기
클래스형 뷰 또는 클래스형 제네릭 뷰는 장고 사용할 때 제일제일 중요한 기능
익숙해져야하고, 내가 응용할 수도 있어야함!! -> 프로젝트 하려면 잘 익혀두자..
books/views.py 을 작성하자
5.1.6 애플리케이션 - Template 코딩하기
이 애플리케이션은 뷰 클래스 7개, 템플릿 파일도 7개가 필요하다.
html 은 간단하게 알아두자
먼저 첫 화면인 index.html을 작성해주기 위해 template 폴더를 만들어준다
위 코드 설명하자면
base_books.html 템플릿을 상속받아서 content 블록만 재정의했다
model_list 의 컨텍스트 변수를 전달받은걸 순회하면서 화면에 하나씩 보여준다
또한 모델명을 클릭하면 접속할 url 추출을 위해 {% url urlvar %} 템플릿 태그를 사용
add, lower 필터를 사용해서 모델명을 소문자로 변환, 필요한 문자열을 붙여줌
-> 모델명이 Author 이면 urlvar은 books:author_list 가 되는 거임]
나머지 템플릿도 base_books.html 템플릿 상속받아 작성하자
이번엔 상세정보 보여주는 템플릿 파일들 작성해보자
순회 for 태그와 if else 태그들을 적절히 활용한 코드이다.
object는 뷰에서 넘겨준 Book의 특정 객체이고
이 객체에 title도 있고, publisher도 있고.. 등등 있을 거다.
저자가 여러명이면 콤마를 추가할 수 있도록 작성
5.1.7 애플리케이션 - Template 상속 기능 추가
base.thml 이랑 base_books.html 템플릿은 아직 작성 안한 상태이다.
base_books.html 은 base.html 을 상속받아서 title 블록이랑 sidebar 블록만 재정의 하고 있고
xxx_list.html 이랑 xxx_detail.html, index.html 은 content 블록만 재정의 하고 있다
관계가 이렇게 된다
base.html --- base_books.html --- xxx_detail.html
부모 템플릿은 각각의 애플리케이션에서만 쓰이는 템플릿이 아니어서
공통 템플릿이라고 봐야한다 -> templates 디렉토리에 저장하자
왜냐면.. 설정 파일에서 아래처럼 적어놨기 때문이다.
templates 폴더에 base.html을 작성해줬다.
{% load static %} 템플릿 태그는 static 이라는 사용자 정의 태그를 로딩해주고
admin/css/base.css 스타일 시트 파일을 찾게 된다.
->장고의 admin 사이트에서 사용하는 스타일 시트를 사용하여 룩앤필 보여주는 효과
base_books.html 도 작성하자
맨 윗줄을 보면 base.html를 상속받아서 title 블록이랑 sidebar 블록을 다시 정의하고 있는 걸 볼 수있다.
block.super 저건 부모 템플릿에서 정의했던걸 하위 템플릿에서 재사용한다는 의미이다.