인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

타뮤직님의 프로필 이미지
타뮤직

작성한 질문수

장고 설계철학으로 시작하는 파이썬 장고 입문

실습 - django-bootstrap5 적용 및 post_new 뷰 구현

app.view에서 클래스 제네릭 방식 질문

해결된 질문

작성

·

193

1

실습 - django-bootstrap5 적용 및 post_new 뷰 구현 수업을 듣다가 질문 합니다.

클라이언트 웹 브라우저에서 http://localhost:8000/app/new/ 클릭을 하면 url.py에서 라우팅(?)된 경로( view.py의 post_new)로 가서 post_form.html을 렌더링 해야 하는데... post_new 인스턴스 변수(?)로만 있는데 어떻게 post_form.html 이 렌더링 되는건가요? 그리고 post_form.html 에서 {% bootstrap_form form %}의 코드 중 form이 어디에서 왔는지도 알려주세요. 감사합니다ㅡ

덧"
함수로 구현 할 땐 리턴 시 렌더함수를 사용하니까 직관적이였는데... generic은 흐름을 못 쫓아 가겠습니다.

[실습] 수업 때 만들었던 실습 파일:
#url.py
path("app/new/", app_views.post_new)

#view.py
post_new = CreateView.as_view(model=Post, form_class=PostForm, success_url="/app/")

#forms.py
class PostForm(forms.ModelForm): class Meta: model = Post fields = "__all__"

#models.py
class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField()

#post_form.html
{% extends "app/base.html" %} {% load django_bootstrap5 %} {% block content %} <form action="" method="post" novalidate> {% csrf_token %} {% bootstrap_form form %} <input type="submit" value="저장하기" /> </form> {% endblock %}

감사합니다.

답변 1

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

FormMixin의 get_context_data를 통해 GET 요청에서 form 인스턴스가 추가로 생성이 되고, 이를 템플릿 단에서 활용할 수 있게 됩니다.

관련코드 : https://github.com/django/django/blob/3.2.15/django/views/generic/edit.py#L66

그리고, SinleObjectTemplateResponseMixin의 get_template_names에서 지정 모델의 app_label과 model_name 그리고 현 CBV의 template_name_suffix와 .html을 조합해서 템플릿 경로 후보 문자열을 완성하는 코드가 있습니다. 여기에서 "app/post_form.html"과 같은 템플릿 문자열을 만듭니다.

관련코드 : https://github.com/django/django/blob/653a7bd7b7c2f7c3ffe6b22be53da1472c491474/django/views/generic/detail.py#L144

CreateView에 template_name_suffix = "_form" 정의가 있습니다. CreateView는 SingleObjectTemplateResponseMixin 클래스를 상속받았으며, SingleObjectTemplateResponseMixin 의 클래스 변수인 template_name_suffix 값을 "_form" 으로 재정의했습니다. 그러니 CreateView에서의 get_template_names 메서드 내에서 참조하는 self.template_name_suffix 값은 "_form"이 됩니다.

https://github.com/django/django/blob/653a7bd7b7c2f7c3ffe6b22be53da1472c491474/django/views/generic/edit.py#L179

소스코드만 따라서 보실려면 그 흐름을 따라하기 힘들구요. 실제 요청을 처리하는 뷰에서 get/post 메서드에 대해서 브레이크 포인트를 잡아서 디버깅을 해보시며, 한 스텝씩 따라서 실행해보시고 각 값의 변화도 살펴보시면, 실제 동작을 이해하시는 데에 큰 도움이 됩니다.

혹시나 CBV가 FBV보다 나은 기술이라고 생각하셔서는 안 됩니다. 둘 다 장고 뷰의 핵심 기술입니다. 구현 내용에 따라 적절히 선택하시면 됩니다. // CBV를 처음부터 하시기보다, FBV로 어느 정도 구현하실 수 있을 만큼 수련이 되신 후에 CBV를 하시면 코드 중복을 줄이는 데에 큰 도움이 됩니다. 이때 파이썬 클래스 문법에 대한 이해가 먼저 선행되어야 합니다. CBV가 복잡해보이지만 중복을 줄이고자 하는 장고의 핵심철학을 구현하는 기술입니다. FBV 기본이 잡히신 뒤에 Generic의 각 클래스 코드들을 하나씩 살펴보시고 곱씹어보세요. 그럼 각 Generic 클래스의 역할에 대해서 보다 깊이 이해하시게 될 것입니다.

질문이 해결되셨다면 본 질문의 상태를 해결됨으로 변경 부탁드립니다.

화이팅입니다. :-)

타뮤직님의 프로필 이미지
타뮤직

작성한 질문수

질문하기