본문 바로가기

Web Programming/Django

댓글 기능 추가하기(모델 관계)

대부분의 웹에서 우리는 게시글에 대한 댓글들을 이용한다.

그렇기에 우리도 댓글 기능을 추가하기 위해 모델관계에 대해 간략히 알아보고자 한다.


장고에서는 모델 관계를 설정하는데 있어 기본적으로 DB를 활용한다.

외래키를 활용하여 모델들 간의 관계를 맺곤 한다.


1
2
3
4
5
6
7
8
class Artist(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
 
class work(models.Model):
    maker = models.ForeignKey(Artist, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
cs


Artist 한 명에 여러 개의 work가 소속되어 있음을 설정하기 위해 work 모델에 maker라는 field를 설정한다.

그리고 ForeignKey로 Aritist와 관계를 설정하여 Artist에 여러 개의 work가 소속되어 있음을 표현할 수 있다.

models.CASCADE를 통해 참조하고 있는 Artist 모델 데이터가 삭제될 경우 같이 삭제됨을 설정할 수도 있다.


또한 다대다의 관계는 manytomany field를 활용해서 표현할 수 있다.


1
2
3
4
5
6
7
class Car(models.Model):
    # ...
    pass
 
class People(models.Model):
    # ...
    cars = models.ManyToManyField(Car)
cs


이러한 모델 관계 설정을 통해 댓글 기능을 구현할 수 있다.

먼저, 댓글 모델을 만들어준다. 그리고 해당 댓글 모델을 활용할 Form을 만들어준다.


1
2
3
4
5
6
7
8
9
10
# project/blog/models.py
...
class Comment(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE, null=True, related_name='comments'# 관계 설정
    comment_date = models.DateTimeField(auto_now_add =True) # 댓글 날짜
    comment_body = models.CharField(max_length=200# 댓글 내용
    comment_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True) # 유저 관계설정
    
    class Meta:
        ordering=['id'# 정렬기준
cs



다음 migrate를 해준다.


1
2
$ python manage.py makemigrations
$ python manage.py migrate
cs



그리고 template을 수정해준다.


1
2
3
4
5
6
7
8
9
10
11
<form method="POST" action="/blog/newreply">
    {% csrf_token %}
    <input type="hidden" value="{{blog.id}}" name="blog">
    댓글 작성 : <input type="text" name="comment_body"></input>
    <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>
{% endfor %}
 
cs


마지막으로 url과 views.py에 함수를 추가해준다.


1
2
3
# project/blog/urls.py
...
path('newreply',views.newreply, name="newreply")
cs


1
2
3
4
5
6
7
8
9
10
11
# project/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']) # id로 객체 가져오기        
                comment.comment_user = request.user.username
                comment.save()
                return redirect('/blog/'+ str(comment.blog.id))
        else :
                return redirect('home'# 홈으로
cs


이렇게 작성을 하면 다음과 같이 댓글 창과 작성을 할 수 있게 된다.

댓글 작성창을 Form 태그를 활용하지 않았는데, hidden 이라던지 객체 관계를 설정하는데 있어 많은 시간이 소요될 것으로 보여 간략하게 html input 태그들을 활용하여 처리하였다.



'Web Programming > Django' 카테고리의 다른 글

소셜로그인 API 활용하기  (0) 2019.02.26
네이버 지도 API 활용하기  (0) 2019.02.22
Django 장고 텍스트에디터 사용하기(CKeditor)  (4) 2019.02.19
Form 활용하기  (0) 2019.02.16
Blog 프로젝트 정리  (0) 2019.02.12