티스토리 뷰

django

django / 댓글 기능 구현

4567은 소수 2020. 12. 25. 22:42

이번에는 간단한 댓글 기능을 구현해보도록 하겠습니다. 

댓글 기능 구현까지만 하고 다음부터는 그냥 토이프로젝트로 공부한 걸 올리도록 하겠습니다. 좋아요, 대댓글, 프로필 만들기 등 많지만 예전에 한 걸 몰아서 하려니 너무 힘드네요...

 

댓글 기능은 detail 페이지에 한꺼번에 나타내기 위해 comment.html과 같은 html을 따로 만들지 않고, url또한 만들지 않겠습니다. 

 

우선 model을 추가해줍니다. models.py에서 Comment라는 모델을 추가합니다.

class Comment(models.Model):
  post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True)
  body = models.TextField()
  date = models.DateTimeField(default=timezone.now)

댓글은 한 게시글에 여러개가 달리는 1대 다수의 구조를 가지므로 Post로부터 ForeignKey를 가져오고, 해당 게시글이 삭제되면 댓글들도 모두 삭제하기 위해 on_delete = models.CASCADE를 추가해줍니다. 그리고 해당 댓글의 내용과 날짜를 모델에 구현해줍니다.

 

이제 views.py의 기존의 detail을 살펴봅시다. 

def detail(request,post_id):
  post_detail = get_object_or_404(Post,pk=post_id)
  comments = Comment.objects.filter(post = post_id)
  if request.method == "POST":
    comment = Comment()
    comment.post = post_detail
    comment.body = request.POST['body']
    comment.date = timezone.now()
    comment.save()
  return render(request,'detail.html',{'post':post_detail, 'comments':comments})

 

기존의 detail 함수에서 해당 게시글에 달린 모든 댓글을 comments =  부분을 이용해 가져옵니다. 그리고 POST 방식으로 제출이 들어올 때 새로운 댓글을 달도록 만들어 줍니다. 새로운 글을 작성하는 것과 유사하기에 어렵지는 않습니다.

 

이제 detail.html에 댓글 부분을 추가합시다.

{% extends 'base.html' %}
{% block content %}
<div class="container">
  <!--생략-->
  댓글 : 
  {% for comment in comments %}
  {{comment.body}} - {{comment.date}} - {{user.username}}
  <br>
  {% endfor %}

  <br><br>
  댓글 달기 : 
  <form method="POST">
    {% csrf_token %}
    <input name="body" type="text" value="">
    <input class="btn btn-primary" type="submit" value="저장">
  </form>

</div>
{% endblock %}

detail 함수에서 comments 라는 녀석으로 해당 글의 모든 댓글을 저장한 list로 사용합니다. 그렇기에 comments에 있는 애들을 for문을 이용해 순차적으로 출력시키면 해당 글의 모든 댓글을 나타낼 수 있습니다. 그리고 댓글을 달기 위해 POST 방식으로 댓글 내용을 제출하면 됩니다. 물론 csrf_token은 반드시 해주어야 올바르게 제출이됩니다.

 

추가적으로 댓글을 로그인 한 상태에서만 달게 하거나 댓글 삭제, 대댓글 등 구현을 할 수 있습니다. 로그인 한 상태에서 댓글 다는 것은 {% if user.is_authenticated %} 를 이용해 user가 접속 중인지 파악하면 되고, 댓글 삭제, 대댓글은 기존의 글 삭제와 댓글 달기와 유사합니다. 

 

간단히 구현한 결과는 아래와 같습니다.

 

 

'django' 카테고리의 다른 글

django / 비밀번호 변경  (0) 2020.12.29
django / 소셜 로그인 구현  (0) 2020.12.29
django / 글 수정, 삭제  (0) 2020.12.25
django / 사진 업로드 (media)  (0) 2020.12.25
django / 새 글 작성  (0) 2020.12.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함