UpdateView는 Django에서 기본으로 제공하는 제네릭 편집 뷰(Generic Editing View) 중 하나로, 프런트엔드 화면에서 모델 데이터를 손쉽게 수정할 수 있게 해주는 기능입니다. 복잡한 로직을 직접 작성하지 않아도 관리자(Admin) 페이지처럼 데이터를 업데이트하는 화면을 빠르게 구현할 수 있다는 점이 큰 장점입니다. 이번 글에서는 간단한 예제를 통해 Django에서 UpdateView를 적용하는 방법을 단계별로 살펴보겠습니다.
프로젝트 및 앱 준비하기
먼저 Django 프로젝트와 앱을 생성합니다. 이 글에서는 프로젝트 이름을 tutorial11, 앱 이름을 modelFormsDemo로 만들었다고 가정하겠습니다.
django-admin startproject tutorial11 python manage.py startapp modelFormsDemo
이제 몇 가지 기본 설정을 진행하겠습니다.
1. settings.py에 앱 등록
생성한 앱을 settings.py의 INSTALLED_APPS 목록에 추가합니다.
INSTALLED_APPS = [
...,
'modelFormsDemo',
]
2. 프로젝트 urls.py 설정
프로젝트의 urls.py에 앱의 URL 설정을 포함시킵니다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('modelFormsDemo.urls')),
]
3. 앱 urls.py 설정
앱 디렉터리에 urls.py 파일을 생성하고 아래 코드를 추가합니다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name="home"),
path('student/edit/<int:pk>/', views.StudentUpdateView.as_view(), name="update"),
path('success/', views.success, name='success'),
]
여기서는 총 세 개의 URL을 정의했습니다. 첫 번째는 메인 화면(학생 등록 폼)을 렌더링하는 URL, 두 번째는 UpdateView를 통해 특정 학생 정보를 수정하는 URL, 세 번째는 수정 완료 후 리디렉션될 성공 페이지용 URL입니다.
모델 작성하기
models.py에 아래와 같이 간단한 Student 모델을 정의합니다.
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)
학생의 이름(name), 학년(standard), 반(section)을 저장하는 아주 기본적인 모델입니다.
뷰(View) 작성하기
views.py에 다음 코드를 추가합니다.
from django.shortcuts import render
from .forms import StudentForm
from django.views.generic.edit import UpdateView
from .models import Student
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 StudentUpdateView(UpdateView):
model = Student
fields = '__all__'
template_name = 'update_view.html'
success_url = '/success/'
def success(request):
return render(request, 'success.html')
StudentUpdateView 클래스가 이 글의 핵심입니다. 어떤 모델(model=Student)을 대상으로 할지, 어떤 필드를 폼으로 노출할지(fields='__all__'), 어떤 템플릿(template_name)을 렌더링할지, 수정 성공 후 어디로 이동할지(success_url)만 지정하면 나머지 처리는 Django가 자동으로 수행합니다. home 뷰는 새 학생을 등록하는 폼 화면을 담당하고, success 뷰는 수정 완료 후 보여줄 페이지를 렌더링합니다.
폼(Form) 작성하기
앱 디렉터리에 forms.py 파일을 생성하고 다음 코드를 추가합니다.
from django import forms
from .models import Student
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ['name', 'standard', 'section']
Student 모델을 기반으로 하는 ModelForm을 만들어 화면에 렌더링할 폼을 준비했습니다.
템플릿 작성하기
앱 디렉터리 안에 templates 폴더를 만들고, 그 안에 home.html, update_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 }} : {{ fm }}<br>
{% endfor %}
<button type="submit">Submit</button>
</form>
</body>
</html>
update_view.html
UpdateView는 컨텍스트 변수 form으로 폼 객체를 전달하므로 아래와 같이 작성하는 것이 좋습니다.
<!DOCTYPE html>
<html>
<head>
<title>TUT</title>
</head>
<body>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
</body>
</html>
success.html
<!DOCTYPE html>
<html>
<head>
<title>TUT</title>
</head>
<body>
<h2>Success!</h2>
</body>
</html>
여기까지 완료되면 모든 준비가 끝났습니다. 마이그레이션을 수행하고 개발 서버를 실행해 결과를 확인해 보겠습니다.
python manage.py makemigrations python manage.py migrate python manage.py runserver
실행 결과 확인
home.html 실행 화면:

메인 페이지에서는 새 학생을 등록할 수 있는 폼이 표시됩니다. 이제 브라우저에서 https://127.0.0.1:8000/student/edit/(학생 객체 ID)/ 형태의 주소로 접속하면 update_view.html 화면을 확인할 수 있습니다. 예를 들어 1번 학생을 수정하려면 https://127.0.0.1:8000/student/edit/1/로 접속하면 됩니다.
update_view.html 실행 화면:

기존 값이 폼에 채워진 상태로 나타나며, 값을 수정한 뒤 Submit 버튼을 클릭하면 데이터베이스가 갱신되고 /success/ 페이지로 이동하는 것을 확인할 수 있습니다.
이처럼 Django의 UpdateView를 활용하면 단 몇 줄의 코드만으로 데이터 수정 기능을 완성할 수 있습니다. 같은 방식으로 CreateView, DeleteView 같은 다른 제네릭 편집 뷰도 활용할 수 있으니 함께 익혀두면 CRUD 화면을 훨씬 빠르게 구축할 수 있습니다.