기술블로그-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가 자동으로 처리해준다!