Django DeleteView란?
DeleteView는 Django에서 기본으로 제공하는 제네릭 뷰(Generic View) 중 하나로, 웹 프론트엔드에서 모델 데이터를 손쉽게 삭제할 수 있도록 도와주는 기능입니다. 별도의 복잡한 로직 없이 몇 줄의 코드만으로 적용할 수 있는 내장 뷰이며, 동작 방식은 Django 관리자 페이지(admin)에서 객체를 삭제할 때와 유사합니다. 실무 프로젝트에서 데이터 삭제 기능을 빠르게 구현해야 할 때 특히 유용합니다.
이 글에서는 DeleteView를 활용해 학생(Student) 정보를 삭제하는 전체 과정을 단계별로 살펴보겠습니다.
1. 프로젝트 및 앱 생성
먼저 Django 프로젝트와 앱을 생성합니다. 여기서는 프로젝트 이름을 tutorial11, 앱 이름을 modelFormsDemo로 지정했습니다.
django-admin startproject tutorial11 cd tutorial11 python manage.py startapp modelFormsDemo
settings.py 설정
생성한 앱을 settings.py의 INSTALLED_APPS 목록에 등록합니다.
INSTALLED_APPS = [
...,
'modelFormsDemo',
]
프로젝트 urls.py 설정
프로젝트 최상위 urls.py에 앱의 URL을 연결(include)합니다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('modelFormsDemo.urls'))
]
이렇게 하면 루트 경로로 들어오는 요청이 앱의 urls.py로 전달됩니다.
앱 urls.py 설정
앱 디렉터리 안에 urls.py 파일을 만들고 다음과 같이 세 개의 URL 패턴을 작성합니다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name="home"),
path('student/delete/<int:pk>/', views.StudentDeleteView.as_view(), name="delete"),
path('success/', views.success, name='success')
]
여기서는 총 3개의 URL을 정의했습니다.
- '' : 프론트엔드 메인 화면(학생 등록 폼)을 렌더링합니다.
- 'student/delete/<int:pk>/' : DeleteView가 해당 학생 객체를 삭제하기 위해 사용하는 URL입니다.
- 'success/' : 삭제가 완료된 후 리다이렉트되는 성공 페이지입니다.
2. 모델(Model) 작성
models.py에 간단한 학생 모델을 추가합니다.
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
standard = models.CharField(max_length=100)
section = models.CharField(max_length=100)
def __str__(self):
return self.name
이름(name), 학년(standard), 반(section) 필드로 구성된 기본적인 모델입니다. __str__ 메서드를 추가하면 삭제 확인 화면에서 객체를 더 읽기 쉬운 형태로 표시할 수 있습니다.
모델 작성 후에는 마이그레이션을 실행해 데이터베이스에 반영합니다.
python manage.py makemigrations python manage.py migrate
3. 뷰(View) 작성
views.py에 다음 코드를 추가합니다.
from django.shortcuts import render
from .forms import StudentForm
from django.views.generic.edit import DeleteView
from .models import Student
from django.urls import reverse_lazy
def home(request):
if request.method == 'POST':
form = StudentForm(request.POST)
if form.is_valid():
form.save()
stuForm = StudentForm()
return render(request, 'home.html', {"stu_form": stuForm})
class StudentDeleteView(DeleteView):
model = Student
template_name = 'delete_view.html'
success_url = reverse_lazy("success")
home 뷰는 GET 요청 시 학생 등록 폼을 렌더링하고, POST 요청 시 유효성 검사를 거쳐 데이터를 저장합니다. 핵심은 StudentDeleteView 클래스입니다.
- model = Student : 삭제 대상이 될 모델을 지정합니다.
- template_name = 'delete_view.html' : 삭제 확인을 요청하는 템플릿을 지정합니다.
- success_url = reverse_lazy("success") : 삭제 성공 후 이동할 URL을 지정합니다. URLconf가 로드되기 전에 평가되는 것을 방지하기 위해 reverse_lazy를 사용하는 것이 좋습니다.
4. 폼(Form) 작성
앱 디렉터리에 forms.py 파일을 생성하고 아래 코드를 작성합니다.
from django import forms
from .models import Student
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ['name', 'standard', 'section']
ModelForm을 사용해 Student 모델의 모든 필드를 자동으로 폼에 매핑했습니다. 이 폼은 home 뷰에서 렌더링됩니다.
5. 템플릿(Template) 작성
이제 앱 디렉터리 안에 templates 폴더를 만들고, 그 안에 home.html, delete_view.html, success.html 세 개의 파일을 생성합니다.
home.html
<!DOCTYPE html>
<html>
<head>
<title>TUT</title>
</head>
<body>
<form method="post">
{% csrf_token %}
{% for fm in stu_form %}
{{ fm.errors }}<br>
{{ fm.label_tag }} {{ fm }}<br>
{% endfor %}
<button type="submit">Submit</button>
</form>
</body>
</html>
delete_view.html
<!DOCTYPE html>
<html>
<head>
<title>TUT</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<p>정말 "{{ object }}" 을(를) 삭제하시겠습니까?</p>
<input type="submit" value="Confirm">
</form>
</body>
</html>
success.html
<!DOCTYPE html>
<html>
<head>
<title>TUT</title>
</head>
<body>
<h2>Success</h2>
</body>
</html>
세 파일의 역할은 다음과 같습니다.
- home.html : 새 학생을 등록하는 화면
- delete_view.html : 삭제 전 최종 확인을 묻는 화면
- success.html : 삭제 성공 후 리다이렉트되는 화면
모든 POST 폼에는 CSRF 보호를 위해 {% csrf_token %} 태그가 반드시 포함되어야 한다는 점에 유의하세요.
6. 실행 결과 확인
개발 서버를 실행합니다.
python manage.py runserver
home.html 화면입니다. 여기서 학생 데이터를 등록할 수 있습니다.
<img src="https://kr.wsxdn.com/UploadFiles_1288/202204/2022040618081229.png" />
이제 브라우저에서 https://127.0.0.1:8000/student/delete/학생ID/ 형식의 URL로 접속하면 삭제 확인 화면(delete_view.html)이 나타납니다. Confirm 버튼을 누르면 해당 학생 객체가 삭제되고 success 페이지로 이동합니다.
delete_view.html 화면입니다.
<img src="https://kr.wsxdn.com/UploadFiles_1288/202204/2022040618081206.png" />
마무리
이처럼 Django의 DeleteView를 사용하면 모델, 뷰, 템플릿만 간단히 정의해도 관리자 페이지 수준의 삭제 기능을 프론트엔드에 손쉽게 구현할 수 있습니다. ListView, DetailView, UpdateView 같은 다른 제네릭 뷰와 조합하면 CRUD 기능 전반을 매우 효율적으로 완성할 수 있으니 함께 활용해 보시기 바랍니다.