post_detail 수정
post_list와 다를바 없이 오른쪽 카테고리 카드에 카테고리 목록과 각각의 카테고리에 포스트가 몇 개인지 소괄호로 표시되게끔 한다.
테스트 코드 수정
필요한 포스트 1,2,3은 setUp() 함수에서 만들어 두었기 때문에 조금만 수정해 준다.
역시나 카테고리 카드를 위한 정보를 views.py의 PostDetail 클래스에서 정의하지 않았기 때문에 programming (1) 을 찾을 수 없다는 오류를 출력한다.
get_context_data() 메서드로 category 인자 넘기기
카테고리 카드에 정보를 넘겨주기 위해 views.py 파일을 수정한다. post_list 에 category 관련 인자를 넘긴것과 마찬가지로 주요 코드에 PostDatail로 바꿔준다
template 수정
post_list 파일의 {% if p.category %} 부터 {% endif %}부분을 그대로 복붙하고 중괄호{} 부분의 p 를 post로만 바꿔주면 된다.
카테고리 페이지 만들기
카테고리를 클릭하면 해당 카테고리와 관련있는 포스트만 보여주는 페이지를 말한다.
테스트 코드 작성
setUp() 함수에 카테고리 2개가 만들어져 있으므로 이를 이용해 코드를 작성한다.
category 모델 수정
그대로 테스트를 실행하면 Category 모델에 get_absolute_url 함수를 정의하지 않았기 때문에 오류가 출력된다.
Post 모델의 get_absolute_url은 pk를 고유 값으로 했지만 Category모델은 slug 필드를 이용하여 고유 URL을 만들어 본다.
먼저 models.py 파일에 코드를 추가한다.
URL 정의 (urls.py)
category/ 뒤에 문자열이 붙는 URL을 입력하면 그 문자열을 views.py 에 정의할 category_page() 함수의 매개변수인 slug의 인자로 넘겨주도록 코드를 작성해 본다. 예를 들면 blog/category/programming/ 이라고 입력될 시 programming/ 만 떼서 views.py의 category_page() 함수로 보낸다.
views.py 수정
FBV 방식으로 category_page() 함수를 만들었다 이전에 쓰인 쿼리셋이 다시 나온것을 볼 수 있다.
이때 주석 처리 해두었던 FBV 방식으로 함수를 만들떄 필요한 render를 import 하지 않으면 NameError: name 'render' is not defined 오류를 출력한다.
category_page() 함수를 만들때 어느 특정 클래스에 속하게 되면
category_page() 함수를 불러오지 못해 module 'blog.views' has no attribute 'category_page' 오류를 출력하게 된다.
아래 스크린샷은 잘못된 경우로 함수 전체를 한 번 내어쓰기 해주어 class PostList(ListView) 클래스에서 벗어나도록 한다.
template 수정
포스트 목록 페이지가 아닌 카테고리 페이지 에서만 추가한 뱃지가 보이도록 if문을 사용한다.
미분류 카테고리 처리
Category 모델의 레코드 중 name 필드가 no_category인 레코드가 없으므로 오류가 나타난다. blog/views.py의 category_page() 함수의 slug 인자에 'no_category' 가 오는 경우 미분류 포스트를 보여준다. category 변수에는 Category 모델의 레코드가 아닌 '미분류' 라는 문자열만 저장한다.
'Backend > Django + Bootstrap 개발 일지' 카테고리의 다른 글
20. 폼으로 포스트 작성 (0) | 2022.08.11 |
---|---|
19. 다대다 관계 구현(19 ~ 22) (Tag 모델, 포스트 목록과 상세 페이지에 태그 기능 추가, 태그 페이지 구현 ) (0) | 2022.08.08 |
17. 다대일 관계 구현 (카테고리 기능) (0) | 2022.08.05 |
16. 다대일 관계 구현(16 ~ 18) (작성자 추가) (0) | 2022.07.29 |
15. 템플릿 모듈화 (0) | 2022.07.27 |