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는 사용자 입력 데이터
수정 뷰에서는 둘을 반드시 함께 사용
그렇지 않으면 의도치 않게 새 객체가 생성될 수 있음'Django 프론트& 백엔드 개발' 카테고리의 다른 글
| Django ORM 조회 결과가 없을 때 템플릿에서 처리하는 방법 (if / for 예제) (0) | 2026.01.13 |
|---|---|
| Django 게시글 삭제(Delete) 기능 구현 (0) | 2026.01.11 |
| Django ModelForm으로 Form 위젯 커스터마이징하기 (0) | 2026.01.11 |
| Django Form Validation 에러 출력 방법: form.as_ul vs 수동 렌더링 (0) | 2026.01.11 |
| Django Form에서 유효성 검증 (0) | 2026.01.11 |