target_article 에 foreignkey 로 엮여 있는 comment 들을 모두 가져오기
{% for comment in target_article.comment.all %}
{% include 'commentapp/detail.html' with comment=comment %}
{% endfor %}
Commentapp 의 DeleteView 만들기
...
class CommentDeleteView(DeleteView):
model = Comment
context_object_name = 'target_comment'
template_name = 'commentapp/delete.html'
def get_success_url(self):
return reverse('articleapp:detail', kwargs={'pk': self.object.article.pk})
{% if comment.writer == user %}
{% endif %}from commentapp.views import CommentCreateView, CommentDeleteView
app_name = 'commentapp'
urlpatterns = [
path('create/', CommentCreateView.as_view(), name='create'),
path('delete/<int:pk>', CommentDeleteView.as_view(), name='delete'),
# 어떤 comment 를 지울지 pk 로 받는다.
]
{% extends 'base.html' %}
{% block content %}
{% endblock %}
댓글 지우기
decorators.py 생성
comment 의 주인인지 아닌지 확인하는 과정
from django.http import HttpResponseForbidden
from commentapp.models import Comment
def comment_ownership_required(func): # decorator 정의 (이 계정의 소유권이 필요하다는 이름)
def decorated(request, *args, **kwargs): # request 를 받아
# 우리가 원하는 작업 - 본인인지 확인하는 작업
# get, post 등의 요청을 받으면서 pk 로 받은 값을 가지고 있는 User 객체가 user 가 되는 것
comment = Comment.objects.get(pk=kwargs['pk'])
# pk 를 확인해서 해당 pk 의 Comment 객체가 실제로 request 를 보낸 comment 과 같은지 아닌지 확인
if not comment.writer == request.user: # 댓글의 저자가 지금 요청을 보내는 user 와 다르다면
return HttpResponseForbidden() # 금지 되었다고 내보내기
return func(request, *args, **kwargs) # 같다면 그냥 보내주기
return decorated
# article_ownership_required 라는 decorator 를 만들었으니까 views.py 에 적용하기
views.py 에 decorator 추가
...
@method_decorator(comment_ownership_required, 'get')
@method_decorator(comment_ownership_required, 'post')
class CommentDeleteView(DeleteView):
model = Comment
context_object_name = 'target_comment'
template_name = 'commentapp/delete.html'
def get_success_url(self):
return reverse('articleapp:detail', kwargs={'pk': self.object.article.pk}) # 해당 pk 를 가진 article 로 되돌아가라
이처럼 로그아웃을 하면 delete 버튼이 나오지 않게 된다.