본문 바로가기
개발/Django_python 웹 프레임워크

쟝고 - 댓글 달기

by 자유로운 코끼리 2020. 8. 1.
728x90

댓글은 게시물과 1:N관계를 가지고 있죠.

하나의 글에 여러개의 댓글을 달 수 있으니까요!

 

1. Comment model 작성

from django.contrib.auth.models import User
# models.py
class Comment(models.Model):
	user = models.ForeignKey(User,on_delete=models.CASCADE) 
	post = models.ForeignKey(Post,on_delete=models.CASCADE) 
    	content = models.TextField(blank = True)
    	anonymous = models.BooleanField(default=False)
	created_at = models.DateTimeField(auto_now_add= True)
    	updated_at = models.DateTimeField(auto_now = True)

2. admin권한에 Comment model 추가

from django.contrib import admin
from .models import Post,Comment

admin.site.register(Post)
admin.site.register(Comment)

3. 모델 migrate

python manage.py makemigrations
python manage.py migrate

4. detail.html(자세히 보기 페이지)

이제 댓글 형식을 넣을 차례입니다.

글을 자세히 보는 detail 페이지 아래에 댓글 창이 있으면 되겠죠?

{% if user.is_authenticated %}
<form action="{%url 'comment_create' blog.id%}" method="POST">
    {%csrf_token%}
    <input type="text" name="comment" placeholder="댓글을 입력하세요">

    <input type="checkbox" name="anonymous" value="y">
    <span style="font-size: 0.7em;">익명</span>

    <input type="submit" value="submit">

</form>
{% endif %}

익명을 체크할 수 있도록 체크박스를 만들어 줍니다.

 

5. Views.py

from .models import Post,Comment

Comment 모델을 import 해줍니다.

def comment_create(request,blog_id): # comment create : 댓글 생성&저장 함수
    if request.method == "POST":
        comment = Comment() 
        comment.user = request.user # request.user 는 현재 접속한 유저의 정보
        comment.post = Blogapp.objects.get(id=blog_id) # blog_id 는 댓글을 단 blog의 id(인증키)
        comment.content = request.POST['comment'] # 'comment'는 text input의 name  
        anonymous = request.POST.get('anonymous',False)  
        if anonymous == "y":
            comment.anonymous = True
        comment.save() 
        return redirect('/blog/detail/' + str(blog_id))  

Blogapp.objects.get() 에서 object.get은 괄호 안에 해당하는 값을 하나 반환하는 메서드입니다.

즉, 하나의 Row만을 가져오기 위해서 get() 메서드를 사용합니다.

해당 조건의 요소가 존재하지 않을때는 DoesNotExist, 여러개 존재할때는 MultipleObjectsReturned 에러가 발생합니다.

 

request.POST.get()에서의 get() 메서드는 key 값이 있으면 value값을 리턴해줍니다.

이때 키 값이 존재하지 않으면 디폴트값인 None을 리턴합니다.

이때 저희는 anonymous안에 값이 없으면 False를 return 하도록 해주었어요.

 

만약 익명에서 버튼을 눌렀다면 value인 y가 반환되어 True로 바뀌어 db에 표시될 것이고,

그렇지 않다면 False로 표시가 되지 않게 되겠죠!

 

7. url 등록해주시구!

path('blog/comment_create/<int:blog_id>',blogapp.views.comment_create,name="comment_create"),

 

댓글 띄우기

댓글은 방금 전 반든 댓글창 아래에 생기도록 해보겠습니다.

detail 함수를 고치면 되겠죠?

8. views.py

def detail(request,blog_id):
    blog=get_object_or_404(Blogapp,pk=blog_id)
    comment = Comment.objects.filter(post=blog.id)
    context={
        'blog':blog,
        'comment':comment
    }
    return render(request,'detail.html',context)

특정 조건에 맞는 Row들을 가져오기 위해서는 filter() 메서드를 사용합니다.

저희는 특정 blog게시물에 붙여진 댓글들을 가져올 것이기 때문에,

특정 게시물의 id값을 가져왔습니다.

 

이제 blog와 comment 변수를 보내줄 건데요.

여러값을 보낼 때 이렇게 dictionary 안에 넣어서 보내줄 수 있습니다.

 

9. detail.html

이제 받아온 comment를 화면에 띄어주겠습니다.

{%for c in comment%}
{%if c.anonymous == True%}
<span>익명</span>
{%else%}
<span>{{c.user}}</span>
{%endif%}
{{c.content}}

<br>
{%endfor%}

이때 익명을 선택한 댓글은 익명으로 띄어야 하니, if문을 통해 나누어줍니다.

 

댓글 삭제

10. views.py

def delete_comment(request,blog_id,comment_id):
    comment_d=Comment.objects.get(id=comment_id) 
    comment_d.delete()
    return redirect('/blog/detail/' + str(blog_id))  

댓글의 id값을 받아와야 삭제할 수 있으니, 댓글의 id값을 받아오고-

삭제 후 다시 해당 게시물을 보여줘야 하니 blog id값도 받아와줍니다.

 

11. urls.py

그러니 url에서 둘 다 보내줘야겠죠?

path('blog/delete_comment/<int:blog_id>/<int:comment_id>',blogapp.views.delete_comment,name="delete_comment"),

 

12. views.py

{%if request.user == c.user or request.user.is_staff %}
<a href="{% url 'delete_comment' blog.id c.id %}">삭제하기</a>
{%endif%}

이를 댓글을 보여주는 for문 안에 넣어주면 됩니다.

{%for c in comment%}
{%if c.anonymous == True%}
<span>익명</span>
{%else%}
<span>{{c.user}}</span>
{%endif%}
{{c.content}}

{%if request.user == c.user or request.user.is_staff %}
<a href="{% url 'delete_comment' blog.id c.id %}">삭제하기</a>
{%endif%}
<br>
{%endfor%}

'개발 > Django_python 웹 프레임워크' 카테고리의 다른 글

Django 모델 - 1:1, 1:N, N:M  (0) 2020.08.04
Django - N:M 좋아요기능(Ajax 사용 X)  (0) 2020.08.03
ModelForm - 댓글 달기  (6) 2020.07.29
ModelForm - Forms.py  (0) 2020.07.25
Pagination  (0) 2020.07.23

댓글