● Tag 모델 만들기
조악스러운 그림으로 설명 하자면 포스트는 복수의 태그를 가질 수 있고 태그는 복수의 포스트의 가질 수 있다. 즉 포스트든 태그든 복수의 관계를 가질수 있는 말하고 다른말로 여러 요소와 동시에 연결된 관계를 다대다 관계라고 한다. 구현을 할때 django에서는 ManyToManyField를 사용한다.
Tag 모델 구현
models.py에 Tag 모델 작성 후 migration
포스트 모델에 tags 필드를 추가하기 위해 ManyToManyField 사용으로 위에서 작성한 Tag 모델을 연결한다.
migration 하려고 하면 null은 ManyToManyField에서 효과가 없다고 한다. null을 허용하지 않는다는 뜻인가? 하며 책을 읽어보니 ManyToManyField 에서는 null=True가 기본 설정이라고 한다. 그렇기 때문에 nulll은 효과가 없다는 경고 문구가 출력되는 것이였다. models.py 에서 작성한 tags 필드의 null=True를 삭제 후 다시 migration 한다.
관리자 페이지에 태그 추가하기
관리자 페이지에 태그를 추가하기 위해 admin.py 파일에 코드를 추가한다. 뒤늦게 궁금해서 찾아낸 것은 prepopulated의 뜻은 '미리 채워진' 이라는 뜻이다.
● 포스트 목록과 상세 페이지에 태그 기능 추가
테스트 코드에 태그 추가
tests.py에 태그 3개 추가하기
테스트를 위해 tests.py에 python, bootstrap, django 태그를 만든다.
태그 3개를 포스트에 연결하기
category, author 과는 다르게 tag는 objects.create() 안에 인자로 넣지 않고 add() 함수로 추가한다. 이는 ManyToManyField는 다대다 관계로서 여러 레코드를 연결수 있기 때문이다. post_001 에는 python 태그를 post_002는 태그를 부여하지 않는다. post_003은 bootstrap 과 django 태그를 연결한다.
포스트 목록 페이지에 태그 기능 추가
포스트 카드 하단 부분에 태그가 출력되도록 한다.
테스트 코드 수정
포스트에 연결된 태그는 assertIn으로 각 포스트 카드에 텍스트로 존재하는지 확인하고 포스트에 연결되지 않은 태그는 assertNotIn으로 들어있지 않은지 확인한다.
템플릿 수정 후 테스트와 확인
원활한 테스트 코드의 진행과 실제 태그를 추가하기 위해 post_list.html에 코드를 추가한 후 테스트를 수행하고 실제로 태그를 실행한 후 웹 페이지에서 확인해 본다.
포스트 상제 페이지에 태그 기능 추가
포스트 상세 페이지의 하단 부분에 태그가 표시되도록 추가해 본다.
테스트 코드 수정
def test_post_detail() 함수에 python 태그만 존재 하는지 확인한다.
템플릿 수정 후 테스트
테스트 코드를 통과하게끔 post_detail.html 파일에 코드를 추가한다. post_list.html 파일에 추가했던 코드와 아주 유사하다.
● 태그 페이지 구현
특정 태그를 클릭시 해당 태그가 달린 포스트만 모아 목록으로 보여주는 페이지를 구현해 본다.
태그 페이지 만들기
테스트 코드 작성
URL 지정
당연히 테그 페이지를 만든적이 없으므로 404 오류가 난다. 그렇기에 먼저 URL을 지정 slug필드를 이용하여 Tag 모델의 레코드들이 고유의 경로를 가질 수 있도록 한다.
views.py에 tag_page 함수 작성
맨위에 Tag를 import 하는 것을 잊지 않고 꼭 입력해 준다. 또한 FBV 방식으로 함수를 만들기 때문에 꼭 request를 빼먹지 않도록 한다.
post_list.html 수정
태그 'python' not found in 'Blog/n '.... 같이 태그 python 을 찾을 수 없다고 한다. post_list.html 에서 태그를 찾을 수 있도록 수정한다.
템플릿 수정
태그와 카테고리를 구분하기 위하여 색상을 달리 해주고, 태그의 name 필드 값 외에 해당 태그의 포스트가 몇 개인지 출력하게끔 tag.post_set.count() 함수를 이용하여 템플릿을 수정한다.
'Backend > Django + Bootstrap 개발 일지' 카테고리의 다른 글
21. 수정 기능 구현 (0) | 2022.08.17 |
---|---|
20. 폼으로 포스트 작성 (0) | 2022.08.11 |
18. 다대일 관계 구현 (카테고리 기능 2) (0) | 2022.08.07 |
17. 다대일 관계 구현 (카테고리 기능) (0) | 2022.08.05 |
16. 다대일 관계 구현(16 ~ 18) (작성자 추가) (0) | 2022.07.29 |