기술블로그-Django편

📌 Django CreateView에서 form.save(commit=False)와 self.object 완전 해부

Chansman 2025. 5. 9. 17:34

📌 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)는 단순한 줄이 아니라,
"폼으로부터 모델 인스턴스를 얻고, 내가 직접 필요한 값들을 넣고, 나중에 저장하는" 실무에서 자주 쓰이는 핵심 패턴이다.