📌 Django CreateView에서 form.save(commit=False)와 self.object 완전 해부
✅ 질문 요약
사용자는 다음과 같은 질문을 가짐:
self.object = form.save(commit=False) 이 코드에서
self.object에는 form이 들어가는 건가요?
🔍 설명에 사용된 코드
class CommentCreateView(LoginRequiredMixin, CreateView):
model = Comment
form_class = CommentForm
def get(self, *args, **kwargs):
raise Http404
def form_valid(self, form):
blog = self.get_blog()
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.blog = blog
self.object.save()
✅ 한 줄 요약 정답
self.object에는 form 그 자체가 아니라, form을 통해 만들어진 Comment 모델 인스턴스가 들어간다!
1️⃣ 코드 라인별 해석
🔸 self.object = form.save(commit=False)
- form은 CommentForm이라는 ModelForm
- .save(commit=False)는 실제 DB 저장 없이 모델 객체만 반환함
- 즉, 이 시점의 self.object는 아직 저장되지 않은 Comment 객체
예시:
<Comment: content='멋진 글입니다!', author=None, blog=None>
🔸 self.object.author = self.request.user
- 현재 로그인한 유저를 댓글 작성자로 지정
🔸 self.object.blog = blog
- 댓글이 달릴 대상 블로그 글을 지정 (ex: /blog/3/이라면 ID 3인 Blog)
🔸 self.object.save()
- 지금까지 설정한 Comment 객체를 DB에 실제로 저장함
2️⃣ 전체 흐름 요약표
단계 설명 결과
form.save(commit=False) | 모델 인스턴스 생성, 아직 저장 X | self.object에 저장됨 |
self.object.author = ... | 작성자 지정 | 값 채움 |
self.object.blog = ... | 대상 블로그 지정 | 값 채움 |
self.object.save() | DB에 최종 저장 | 완료 🎉 |
✅ 진짜 핵심 포인트 요약
- form.save()는 폼을 기반으로 모델 인스턴스를 생성함
- commit=False는 임시 객체만 만들고 저장은 나중에 하겠다는 뜻
- self.object는 그 임시 객체를 담아두는 변수
- 이후 .author, .blog 등을 수동으로 채우고 .save()하면 저장 완료!
💬 결론 한 줄
self.object = form.save(commit=False)는 단순한 줄이 아니라,
"폼으로부터 모델 인스턴스를 얻고, 내가 직접 필요한 값들을 넣고, 나중에 저장하는" 실무에서 자주 쓰이는 핵심 패턴이다.
'기술블로그-Django편' 카테고리의 다른 글
🛠 Django CBV - NoReverseMatch 오류 디버깅 사례 정리 (0) | 2025.05.11 |
---|---|
✅ PyCharm에서 Django URL, static 경로 오류가 날 때 확인할 것! (0) | 2025.05.09 |
📌 Django에서 prefetch_related 완전 정복하기 (쿼리 최소화) (0) | 2025.05.09 |
📌 Django CBV에서 self.object, context['object'] 완전 정복하기 (0) | 2025.05.09 |
📌 Django 템플릿, Form, View, URL, DB 흐름 완전 정복 version 2 (0) | 2025.05.09 |