댓글 작성
- 이번 토픽에서는 admin 페이지에서 댓글을 작성하고 값을 불러와 보도록 하겠습니다.
- admin 페이지로 가서 댓글을 작성해봅니다.
- 블로그 1번 글에다가 댓글을 작성하고 저장하겠습니다.
- 3번째 글에도 댓글을 작성해보도록 하겠습니다.
- 처음 만들면 Comment object (1), 두번째로 만들면 Comment object (2) 이런 식으로 생성될 것입니다.
- 여러번 댓글을 작성하고 지우고 해봅시다.
- 댓글을 적는 순서에 따라 번호가 매겨지는 것을 볼 수 있습니다.
- 이런 식으로 댓글이 작성되면 블로그 글을 참조할 때 1번 블로그 글인지, 2번 블로그 글인지 확인하기 어려울 것 같다는 생각이 듭니다.
필터
- 위에서 보듯이 객체를 참조하기 어려워 보이는 상황에서 필요한 것이 바로 '필터'입니다.
- '필터'에 대해 알아보기 위해 이와 관련된 데이터베이스 지식을 같이 공부하고 넘어가도록 합시다.
- 데이터베이스에서는 테이블을 조회할 때 SQL문에서 'SELECT'라는 것을 사용하여 조회를 합니다.
테이블 안의 모든 데이터를 조회하고자 할 때에는 SELECT 문에서는 '*'를 활용하여 조회를 하게 되는데 이를 장고에서는 '모델클래스.objects.all()'와 같이 사용합니다.
하지만 특정 조건에 해당되는 데이터를 조회하고자 할 때에는 SELECT 문과 WHERE 조건절을 사용하여 조회합니다. 이를 장고에서는 '모델클래스.objects.filter()'와 같이 사용하게 되는 것입니다.
- 우리가 만들었던 Comment 모델은 Blog 모델의 주키를 외래키로 참조하고 있습니다.
- 따라서 필터와 외래키를 활용하면 우리는 각각의 블로그 글에 해당되는 댓글을 가져올 수가 있는 것입니다.
views.py 수정
- 필터를 적용하기 위해 [blogapp]-[views.py]에서 [detail] 함수를 수정하도록 하겠습니다.
from .models import Blog, Comment def detail(request, blog_id): blog_detail = get_object_or_404(Blog, pk=blog_id) comments = Comment.objects.filter(blog_id=blog_id) context = { 'blog_detail': blog_detail, 'comments': comments } return render(request, 'detail.html', context)
- 우리가 작성한 Comment 모델을 import 합니다.
- Blog 모델의 주키인 blog_id 값을 detail 문서가 열릴 때 전달하도록 필터를 지정해줍니다.
- 기존에는 render 함수의 세번째 인자로 { } 딕셔너리 자료형을 활용하여 값을 전달하였습니다.
값이 하나일 경우에는 상관없지만 여러 개의 키와 값이 들어가게 되면 코드를 보기 불편해질 수 있습니다.
이에 장고 공식 문서에서도 볼 수 있듯이 'context'라는 이름으로 값들을 묶고 보내도록 하고 있습니다.
detail.html 수정
- 위의 view에서 'comments'를 보냈으니 값을 받아서 댓글을 출력할 수 있도록 수정해보겠습니다.
- 댓글 html 형식을 그대로 복사하여 댓글 작성자, 작성일, 프로필 url, 내용을 출력해보도록 하겠습니다.
- 사용하지 않는 댓글 html 형식은 주석처리하였습니다.
{% for comment in comments %} <!-- Single Comment --> <div class="media mb-4"> <img class="d-flex mr-3 rounded-circle" src="http://placehold.it/50x50" alt=""> <div class="media-body"> <h5 class="mt-0">{{ comment.comment_user }}</h5> <h5 class="mt-0">{{ comment.comment_date }}</h5> <h5 class="mt-0">{{ comment.comment_thumbnail_url }}</h5> <h5 class="mt-0">{{ comment.comment_textfield }}</h5> </div> </div> {% endfor %}
적용 확인
- 서버를 구동하고 제대로 적용되었는지 확인합니다.
- 첫번째 글에 대한 댓글이 달려있는 것을 볼 수 있습니다.
- 두번째 글에는 댓글을 달지 않았으므로 보이지 않는 것을 알 수 있습니다.
- 3번째 글에는 2번째로 작성한 댓글을 작성하였고 출력이 되는 것을 볼 수 있습니다.