Django - Comments

nathan·2021년 7월 22일
0

Django

목록 보기
20/22
post-custom-banner

게시물과 댓글과의 관계

  • 우선 게시물과 유저의 관계는 다음과 같다.

    • 1(유저) : N(게시물)
    • 한 명의 유저가 여러 개의 게시물을 생성할 수 있다.
  • 그렇다면 게시물과 댓글과의 관계, 댓글과 유저의 관계를 알아보자.

    • 1(게시물) : N(댓글)
    • 게시물 한 개에 여러 개의 댓글이 달릴 수 있다.
    • 1(유저) : N(댓글)
    • 유저 한 명이 여러 개의 댓글을 달 수 있다.

Models.py

  • 위의 생각에 근거하여 모델링을 하면 다음과 같다.
# blog/models.py

class Comment(models.Model):
    blog = models.ForeignKey(Blog, null = True, on_delete=models.CASCADE, related_name="comments")
    comment_user = models.ForeignKey(CustomUser, null=True, on_delete=models.CASCADE)
    comment_body = models.CharField(max_length=200)
    comment_date = models.DateTimeField()

    class Meta:
        ordering = ['comment_date']     # 댓글은 최신이 가장 아래에 있도록 해야한다.
  • related_name : Blog의 입장에서 comment를 불러내고자 할 때 쓰이는 이름을 지정한다.

    • ex. new_blog.comments : 이렇게하면 해당 블로그가 가지는 댓글들을 모두 불러올 수 있다.
  • Blog, CustomUser를 각각 Comment와 ForeignKey로 묶어준다!

  • ordering = ['comment_date'] : 댓글을 적은 순서대로 나열하게 된다.


Urls.py

# blog/urls.py
...
path('newreply', views.newreply, name="newreply"),

Views.py

# blog/views.py
def newreply(request):
    if request.method == "POST":
        comment = Comment()
        comment.comment_body = request.POST['comment_body']
        comment.blog = Blog.objects.get(pk=request.POST['blog'])
        author = request.POST['user']
        print(type(author2), author2)
        if author:
            comment.comment_user = CustomUser.objects.get(username=author)
        else:
            return redirect('blog:detail', comment.blog.id)
        comment.comment_date = timezone.now()
        comment.save()

        return redirect('blog:detail', comment.blog.id)
    else:
        return redirect('home')
  • CustomUser가 있을 때에만 댓글을 달 수 있도록 설정하였음

HTML

/* blog/detail.html */
  <form method="POST" action="/blog/newreply">
    {% csrf_token %}
    <input type="hidden" value="{{blog.id}}" name="blog" />
    <input type="hidden" value="{{user.username}}" name="user" />
    댓글 작성 : <input type="text" name="comment_body" />
    <button type="submit" class="btn btn-secondary">작성</button>
  </form>

  {% for comment in blog.comments.all %}
  <p><span> {{comment.comment_user}} </span> : {{ comment.comment_body }}</p>
  <p>위 댓글을 단 시간 : {{comment.comment_date}}</p>
  {% endfor %}

결과

  • 시간 순서대로 댓글이 작성됨을 볼 수 있다.
  • 다음 번에는 댓글의 수정 및 삭제까지 구현해보면 좋을듯하다.
profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.
post-custom-banner

0개의 댓글