티스토리 뷰
이번에는 간단한 댓글 기능을 구현해보도록 하겠습니다.
댓글 기능 구현까지만 하고 다음부터는 그냥 토이프로젝트로 공부한 걸 올리도록 하겠습니다. 좋아요, 대댓글, 프로필 만들기 등 많지만 예전에 한 걸 몰아서 하려니 너무 힘드네요...
댓글 기능은 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 |