[장고] 댓글 기능 구현

소요 시간: 10분

댓글 기능은 사용자 간의 소통을 가능하게 하는 블로그의 핵심 요소 중 하나입니다. 댓글을 통해 독자들은 자신의 의견을 표현하고, 작성자와 상호작용할 수 있습니다. 장고(Django)를 사용하면 이러한 댓글 기능을 쉽게 구현할 수 있습니다. 이 글에서는 댓글 기능을 효율적으로 구현하는 방법을 단계별로 설명합니다.


댓글 모델 정의하기

댓글 모델은 댓글의 작성자, 댓글이 달린 포스트, 댓글 내용, 작성 시간을 포함합니다. 다음은 댓글 모델의 정의입니다:

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    post = models.ForeignKey(Post, related_name='comment', on_delete=models.CASCADE)
    content = models.TextField()
    created_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s - %s' % (self.post.title, self.post.user)

이 모델은 사용자(User)와 포스트(Post) 모델과의 외래 키 관계를 설정하고, 댓글 내용을 저장하는 content 필드와 댓글이 작성된 시간을 기록하는 created_date 필드를 포함합니다.


댓글 폼 생성하기

모델 폼을 상속받아 댓글 작성을 위한 폼을 생성합니다. 이 폼은 사용자가 댓글 내용을 입력할 수 있도록 합니다.

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['content',]
        widgets = {
            'content': forms.TextInput(attrs={
                'class': "input",
                'placeholder': "댓글을 입력해 주세요."
            }),
        }


댓글 뷰 구현하기

댓글을 작성, 수정, 삭제할 수 있는 뷰를 각각 생성합니다. 이 뷰들은 사용자의 요청에 따라 댓글을 데이터베이스에 저장하거나 수정 및 삭제합니다.

댓글 작성 뷰

댓글 작성을 위한 CommentCreateView입니다. CreateView를 상속받아 사용자가 입력한 댓글을 저장합니다.

from django.views.generic.edit import CreateView
from django.urls import reverse

class CommentCreateView(CreateView):
    model = Comment
    fields = ['content']
    success_url = reverse('posts:list')

댓글 수정 뷰

댓글 수정을 위한 CommentUpdateView입니다. UpdateView를 상속받아 기존 댓글을 수정할 수 있도록 합니다.

from django.views.generic.edit import UpdateView
from django.urls import reverse

class CommentUpdateView(UpdateView):
    model = Comment
    fields = ['content']
    success_url = reverse('posts:list')

댓글 삭제 뷰

댓글 삭제를 위한 CommentDeleteView입니다. DeleteView를 상속받아 댓글을 삭제합니다.

from django.views.generic.edit import DeleteView
from django.urls import reverse

class CommentDeleteView(DeleteView):
    model = Comment
    success_url = reverse('posts:list')


URL 설정

각 뷰를 URL과 연결합니다. 이를 통해 사용자가 특정 URL로 접근했을 때, 해당 뷰가 실행됩니다.

from django.urls import path
from .views import CommentCreateView, CommentUpdateView, CommentDeleteView

app_name = 'posts'

urlpatterns = [
    # 생략된 부분
    path('comment/add/', CommentCreateView.as_view(), name='comment-add'),
    path('comment/update//', CommentUpdateView.as_view(), name='comment-update'),
    path('comment/delete//', CommentDeleteView.as_view(), name='comment-delete'),
]


템플릿 작성

댓글 작성 폼을 템플릿에 추가합니다. 이 템플릿은 사용자가 댓글을 입력하고 제출할 수 있는 폼을 제공합니다.

<form action="{% url 'posts:comment-add' %}" method="post">
    {% csrf_token %}
    {{ comment_form }}
    <input type="submit" value="등록">
</form>

위 템플릿 코드는 댓글 작성 폼을 렌더링하고, 제출 버튼을 제공합니다. 사용자가 댓글을 입력한 후 제출하면, 댓글 작성 뷰가 호출되어 댓글이 데이터베이스에 저장됩니다.


마무리

이 글에서는 장고를 사용해 댓글 기능을 구현하는 방법을 살펴보았습니다. 모델 정의, 폼 생성, 뷰 구현, URL 설정, 그리고 템플릿 작성을 통해 댓글 기능을 완성할 수 있습니다. 이러한 기능을 통해 블로그에서 사용자 간의 상호작용을 촉진할 수 있습니다. 장고의 강력한 기능을 활용해 보다 풍부한 웹 애플리케이션을 개발해보세요.

장고 리스트