작정하고 Django 38강 - Commentapp 마무리

_·2024년 1월 7일

작정하고 Django 강의

목록 보기
37/44

target_article 에 foreignkey 로 엮여 있는 comment 들을 모두 가져오기

{% for comment in target_article.comment.all %}
{% include 'commentapp/detail.html' with comment=comment %}
{% endfor %}

{{ comment.writer.profile.nickname }}     {{ comment.created_at }}
{{ comment.content }}

Commentapp 의 DeleteView 만들기

/pragmatic/commentapp/views.py

...

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})
{{ comment.writer.profile.nickname }}     {{ comment.created_at }}
{{ comment.content }}

{% if comment.writer == user %}

{% endif %}
# /pragmatic/commentapp/urls.py 에 delete 경로 설정 from django.urls import path

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 %}

Delete Comment : {{ target_comment.content }}

{% csrf_token %}

{% endblock %}
댓글 지우기

decorators.py 생성
comment 의 주인인지 아닌지 확인하는 과정

/pragmatic/commentapp/decorators.py

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 버튼이 나오지 않게 된다.

commit

0개의 댓글