Django

Chapter 5-6 📌 Django CBV로 블로그 글 삭제 기능 구현하기

Chansman 2025. 5. 8. 10:06

📌 Django CBV로 블로그 글 삭제 기능 구현하기


✅ 1. DeleteView란?

DeleteView는 Django의 제너릭 CBV 중 하나로, 객체를 삭제할 때 사용합니다.

  • 삭제 전 확인 페이지를 보여주거나,
  • 바로 삭제 처리 후 리디렉션하는 방식으로 사용할 수 있습니다.

✅ 2. DeleteView 클래스 구현

# blog/cb_views.py
from django.views.generic import DeleteView
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin
from blog.models import Blog

class BlogDeleteView(LoginRequiredMixin, DeleteView):
    model = Blog

    # 🔹 본인의 글만 삭제 가능하도록 필터링
    def get_queryset(self):
        return super().get_queryset().filter(author=self.request.user)

    # 🔹 삭제 후 목록 페이지로 이동
    def get_success_url(self):
        return reverse_lazy('blog_list')

🔄 코드 흐름 설명:

  1. LoginRequiredMixin → 로그인된 사용자만 삭제 가능
  2. get_queryset() → 현재 로그인한 사용자의 글만 삭제 대상으로 허용
  3. get_success_url() → 삭제 후 리디렉션할 URL 설정

✅ 3. URL 연결

# config/urls.py
from blog import cb_views

urlpatterns = [
    path('cb/<int:pk>/delete/', cb_views.BlogDeleteView.as_view(), name='blog_delete'),
]

➡️ /cb/5/delete/ 같은 주소로 접근 시 ID가 5인 글 삭제 처리


✅ 4. 템플릿에서 삭제 버튼 추가

{# blog_detail.html #}
{% if request.user == blog.author %}
  <div style="text-align: right">
    <a href="{% url 'cb_blog_update' blog.pk %}">수정</a>
    <form id="delete_form" action="{% url 'blog_delete' blog.pk %}" method="POST" style="display: inline">
      {% csrf_token %}
      <button type="button" id="delete_btn">삭제</button>
    </form>
  </div>
{% endif %}

➡️ 현재 로그인한 사용자가 작성자일 때만 삭제 버튼이 표시됩니다.

 

{% block js %}{% endblock %} #base.html 에 추가

 

➡️ base.html 에 하위블록 block js 생성 


✅ 5. 삭제 전 확인 팝업 구현

{% block js %}
<script>
  document.querySelector('#delete_btn').addEventListener('click', function() {
    if(confirm('삭제하시겠습니까?')) {
      document.querySelector('#delete_form').submit();
    }
  });
</script>
{% endblock %}

➡️ 실수 방지를 위해 confirm() 팝업으로 확인 요청 후 삭제 수행


✅ 6. 정리 및 실무 팁

기능 설명

UpdateView 로그인한 사용자만 본인 글 수정 가능
DeleteView 본인 글만 삭제 가능, 삭제 후 목록 이동
get_absolute_url() 삭제 후 이동 URL을 모델에서 지정 가능 (선택)
confirm() 팝업 실수 방지 UX 제공

💡 마무리 팁

  • CBV를 사용하면 CRUD 구조를 짧고 일관성 있게 관리할 수 있습니다.
  • LoginRequiredMixin + get_queryset() 조합은 보안 필터링의 핵심입니다.
  • 삭제는 POST 방식만 허용되므로 form method="POST" + csrf_token은 필수입니다.

실무에서는 삭제 시 별도의 확인 페이지를 두거나, 소프트 삭제(삭제 표시만 하고 실제 데이터는 보존)를 적용하기도 합니다.