Django 프론트& 백엔드 개발

Django 수정(View)에서 request.POST와 instance를 함께 사용하는 이유

Data Jun 2026. 1. 11. 21:46

Django에서 게시글을 **수정하는 뷰(update view)**를 작성할 때는
Form을 생성하는 방식이 작성(create) 뷰와 조금 다릅니다.

from django.shortcuts import render, redirect
from .models import Post
from .forms import PostForm

def post_update(request, post_id):
    post = Post.objects.get(id=post_id)
    if request.method == "POST":
        post_form = PostForm(request.POST, instance=post) 
        if post_form.is_valid():
            post_form.save()
            return redirect('post-detail', post_id=post.id)
    else:
        post_form = PostForm(instance=post) # 데이터를 폼에 입력
    return render(request, 'posts/post_form.html',{'form': post_form})

"post_form = PostForm(request.POST, instance=post" -> 해당 코드 초점 설명.
이 한 줄에는 두 가지 중요한 의미가 동시에 담겨 있습니다.

 

1. instance=post — “어떤 데이터를 수정할 것인가”

instance=post
  • 이미 DB에 저장된 post 객체를 Form에 연결
  • Form이 새 객체를 만들지 않고
  • 기존 객체를 수정하도록 알려주는 역할
  • Form 페이지가 해당 데이터가 채워진 상태로 렌더링된다.

instance가 없으면 Django는 **“새 글을 작성한다”**고 인식합니다.

 

2. request.POST — “사용자가 새로 입력한 값”

request.POST
  • 사용자가 폼에서 입력한 수정된 데이터
  • 이 값으로 validation을 수행
  • 통과하면 DB에 반영

수정이든 생성이든 POST 요청에서는 항상 request.POST가 필요합니다.

 

3. 왜 둘을 같이 써야 할까?

수정은 단순한 저장이 아니라,

기존 데이터(post)를 기준으로
사용자가 입력한 새 값(request.POST)으로
덮어쓰는 작업이기 때문입니다.

PostForm(request.POST, instance=post)

이 구조 덕분에 Django는 다음을 정확히 구분합니다.

경우 Django의 인식
PostForm(request.POST) 새 글 생성
PostForm(instance=post) 수정 폼 표시
PostForm(request.POST, instance=post) 기존 글 수정

 

4. GET과 POST에서 Form을 다르게 쓰는 이유

# GET 요청
post_form = PostForm(instance=post)

기존 데이터를 폼에 채워서 보여주기

# POST 요청
post_form = PostForm(request.POST, instance=post)
  • 기존 데이터를 기준으로
  • 새 입력값을 검증하고 저장

GET = 보여주기, POST = 반영하기

 

5. 정리하면

instance=post는 수정 대상 지정

request.POST는 사용자 입력 데이터

수정 뷰에서는 둘을 반드시 함께 사용

그렇지 않으면 의도치 않게 새 객체가 생성될 수 있음