📌 Django ModelForm의 instance= 사용법 완전 정리
✅ 1. instance=란 무엇인가?
Django의 ModelForm에서 instance=는 기존 모델 객체를 폼에 연결할 때 사용됩니다.
- 해당 객체의 데이터를 폼에 미리 채워주고,
- 사용자가 수정한 값을 다시 그 객체에 저장할 수 있게 해줍니다.
🔧 2. 사용 예시: 수정폼에서 자주 사용됨
✨ Blog 모델 예시
# models.py
from django.db import models
from django.contrib.auth.models import User
class Blog(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
✏️ 3. 수정 뷰에서의 코드 흐름
# views.py
from django.shortcuts import get_object_or_404, redirect, render
from .forms import BlogForm
from .models import Blog
@login_required
def blog_update(request, pk):
blog = get_object_or_404(Blog, pk=pk) # 수정할 기존 객체 가져오기
form = BlogForm(request.POST or None, instance=blog) # 기존 객체를 폼에 연결
if form.is_valid():
form.save() # blog 객체의 내용이 수정됨
return redirect('blog_detail', pk=blog.pk)
return render(request, 'blog_update.html', {'form': form})
🧩 4. 시각적 이해
기존 Blog 객체 (id=5)
├─ title: "기존 제목"
└─ content: "기존 내용"
↓ 폼에 instance=blog 로 전달 ↓
BlogForm(instance=blog)
→ 폼 입력창에 "기존 제목", "기존 내용"이 자동으로 입력됨
↓ 사용자가 수정하고 저장 ↓
form.save() → 기존 blog 객체가 수정됨 (새 객체 아님!)
🔍 5. instance= 없을 때와 비교
상황 코드 동작
새 글 작성 | BlogForm(request.POST) | 새로운 Blog 객체 생성 |
기존 글 수정 | BlogForm(request.POST, instance=blog) | 해당 blog 객체 업데이트 |
💡 6. commit=False와 함께 사용하기
form = BlogForm(request.POST, instance=blog)
blog = form.save(commit=False)
blog.author = request.user # 예: 작성자 수동 지정
blog.save()
- commit=False는 DB에 저장을 잠시 보류하고 객체를 먼저 반환합니다.
- 이후 수동으로 추가 처리한 뒤 .save()로 최종 저장합니다.
✅ 7. 요약
요소 역할
instance=객체 | 기존 데이터를 폼에 채우고 수정 가능하게 함 |
폼 제출 시 | 해당 객체가 수정되어 저장됨 (update) |
사용 위치 | 수정 뷰, 작성자 정보 추가 처리 등 |
장점 | 수정/재사용 시 코드 간결화 및 실수 방지 |
instance=는 Django에서 폼을 통해 데이터를 수정할 때 필수적으로 사용되는 매개변수입니다.
데이터를 수정하고 저장할 일이 많다면 꼭 익숙해져야 할 기능입니다! 😉
'기술블로그-Django편' 카테고리의 다른 글
📌 Django bulk_create() 완전 정리 - 대량 객체 저장할 때 쓰는 방법 (0) | 2025.05.07 |
---|---|
📌 Django render()와 context 완전 정리 + 템플릿 활용 예시 (0) | 2025.05.07 |
📌 Django {% url %} 태그 완전 가이드 - URL 생성의 모든 것 (0) | 2025.05.07 |
📌 Django reverse() 호출부터 뷰 실행까지 전체 실행 흐름 (0) | 2025.05.07 |
📌 Django에서 request.GET.get('next') 완전 정리 (0) | 2025.05.07 |