기술블로그-Django편

📌 Django 템플릿, Form, View, URL, DB 흐름 완전 정복

Chansman 2025. 5. 9. 16:13

📌 Django 템플릿, Form, View, URL, DB 흐름 완전 정복


1️⃣ 질문 배경

사용자는 다음과 같은 의문을 가짐 👇

"템플릿에서는 form 태그에 아무것도 적혀있지 않고,
views.py에서도 render가 명시되어 있지 않은데
어떻게 모든 게 자동으로 연결되는 것처럼 작동하지?"


2️⃣ 핵심 구조 요약

Django에서는 다음 6개의 구성 요소가 유기적으로 작동함:

  • urls.py : 어떤 URL에 어떤 view를 연결할지 결정
  • views.py : 요청에 대한 처리, 템플릿에 전달할 context 구성
  • forms.py : 입력 폼 처리 (ModelForm 포함)
  • models.py : DB 구조 설계
  • templates/xxx.html : 사용자에게 보여줄 화면 구성
  • 데이터베이스 : models를 통해 연결된 실제 저장소

3️⃣ 흐름도 요약

[ 브라우저 요청 (/blog/3/) ][ urls.py ]BlogDetailView.as_view()
        ↓
[ views.py - CBV 자동처리 (get or post) ][ get_context_data() ] → 템플릿에 넘길 context 준비
        ↓
[ blog_detail.html ]context['blog'], context['comment_form'][ form 전송시 → post() ] → 댓글 저장 후 redirect[ models.py + DB 저장 처리 ]

4️⃣ 사용자 질문 기준 핵심 포인트 정리

✅ Q1. form에 action이 없음 → 어디로 보내는가?

  • action이 비어 있으면 현재 URL로 POST 요청됨 (/blog/3/)
  • CBV의 post() 메서드가 자동으로 처리

✅ Q2. templates에서 form을 불러온다고?

  • NO ❌ 직접 불러오는 게 아님
  • YES ✅ views.py에서 넘긴 context['comment_form']를 "출력"하는 것뿐

✅ Q3. get_context_data()에서 render가 없는데 어떻게 연결?

  • CBV 내부에서 자동으로 render 처리
  • 우리가 지정한 template_name = 'blog_detail.html'이 자동 사용됨

5️⃣ CBV 연결 구조 핵심

class BlogDetailView(DetailView):
    model = Blog
    template_name = 'blog_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comment_form'] = CommentForm()
        return context

    def post(self, *args, **kwargs):
        comment_form = CommentForm(self.request.POST)
        if comment_form.is_valid():
            comment = comment_form.save(commit=False)
            comment.blog_id = self.kwargs['pk']
            comment.author = self.request.user
            comment.save()
            return HttpResponseRedirect(reverse_lazy('blog:detail', kwargs={'pk': self.kwargs['pk']}))

6️⃣ 실무 팁 💡

  • get_context_data()는 오직 템플릿에 넘길 변수만 준비
  • render()는 CBV 내부에서 자동으로 호출됨 (우리가 따로 쓸 필요 없음)
  • 따라서 템플릿에서는 {% csrf_token %}이나 {{ comment_form.as_p }}만 있으면 동작함

✅ 결론 한 줄 요약

Django CBV 구조에서는 views.py가 context만 준비하면, 나머지 연결(render, form 처리, 템플릿 출력)은 Django가 자동으로 처리해준다!