멋쟁이 사자처럼 at 한국교통대학교 7기

2019 KNUT X LIKE LION #7

필터

토픽 멋쟁이 사자처럼 at 한국교통대학교 7기 > 웹 애플리케이션 개발 > Django
댓글 작성

  • 이번 토픽에서는 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번째로 작성한 댓글을 작성하였고 출력이 되는 것을 볼 수 있습니다.

 

 

 

 

댓글

댓글 본문
  1. 구본승
    comments = Comment.objects.filter(blog_id=blog_id) 라고 하니까 댓글이 작성 안돼서
    models.py에 blog_id 속성이 없는 걸 확인하고
    comments = Comment.objects.filter(blog=blog_id)로 바꾸니까 잘 실행되네요
  2. Vanillatic
    objects를 object로 써서 한참을ㅠㅠ