Django에서 데이터를 삭제할 때는
GET 요청으로 바로 삭제하지 않고,
반드시 확인 페이지 + POST 요청을 거치는 것이 권장됩니다
이번 글에서는 게시글 삭제 기능을
삭제 확인 페이지와 함께 구현하는 방식을 정리해보겠습니다.
1. 삭제 뷰(Delete View) 구조
from django.shortcuts import render, redirect
from .models import Post
from .forms import PostForm
def post_delete(request, post_id):
post = Post.objects.get(id=post_id)
if request.method == "POST":
post.delete()
return redirect('post-list')
else:
return render(request, 'posts/post_confirm_delete.html', {'post': post})
- GET 요청: 삭제 확인 페이지 렌더링
- POST 요청: 실제 삭제 수행 및 목록 페이지로 리다이렉트
사용자의 실수로 인한 삭제를 방지할 수 있음
2. 삭제 확인 템플릿 구성
{% extends './base.html' %}
{% load static %}
{% block css %}
<link rel="stylesheet" href="{% static 'posts/css/post_confirm_delete.css' %}">
{% endblock css %}
{% block content %}
<div class="confirm">
<p class="title">[{{post.title}}]</p>
<p>삭제하시겠습니까?</p>
<form method="POST">{% csrf_token %}
<div class="confirm_btn">
<input type="submit" value="삭제하기">
</div>
</form>
</div>
{% endblock content %}
- 삭제 대상 제목 표시
- “정말 삭제하시겠습니까?” 안내
- CSRF 토큰 포함
- POST 요청으로만 삭제 가능
<p class="title">[{{ post.title }}]</p>
<p>삭제하시겠습니까?</p>
3. 왜 GET이 아니라 POST로 삭제할까?
| 이유 | 설명 |
| 보안 | URL 접근만으로 삭제 방지 |
| 명확한 의도 | 사용자가 명시적으로 삭제 클릭 |
| REST 원칙 | 데이터 변경은 POST/DELETE |
삭제는 항상 사용자의 명확한 액션이 필요
4. 정리하면
Django 삭제 기능은 GET + POST 분기 구조가 가장 안전
확인 페이지는 UX와 보안을 동시에 만족
실무에서도 가장 많이 사용하는 패턴
삭제는 단순한 기능이 아니라, 신중하게 다뤄야 할 사용자 액션이다.
'Django 프론트& 백엔드 개발' 카테고리의 다른 글
| Django에서 서버 에러 대신 404로 응답하기: get_object_or_404 사용 이유 (0) | 2026.01.13 |
|---|---|
| Django ORM 조회 결과가 없을 때 템플릿에서 처리하는 방법 (if / for 예제) (0) | 2026.01.13 |
| Django 수정(View)에서 request.POST와 instance를 함께 사용하는 이유 (0) | 2026.01.11 |
| Django ModelForm으로 Form 위젯 커스터마이징하기 (0) | 2026.01.11 |
| Django Form Validation 에러 출력 방법: form.as_ul vs 수동 렌더링 (0) | 2026.01.11 |