인프런 커뮤니티 질문&답변
form 인스턴스에 대해 질문입니다!
작성
·
186
0
답변 1
1
안녕하세요.
Post 모델과 PostForm 폼은 별개입니다.
스프링이나 다른 웹프레임워크에서는 웹 요청을 처리할 때 Controller 계층 -> Service 계층 -> Repository 계층으로 나눠서 구현을 하는데요.
현재의 post_new 뷰에서
- Controller 계층이 장고에서는 View이고
- Service 계층이 PostForm 폼이 되고
- Repository 계층이 Post 모델이 됩니다.
PostForm 폼에서는 웹 요청을 실질적으로 처리하는 주체가 됩니다. PostForm을 forms.Form을 상속받아서 하나하나 구현하셔도 되고, Post 모델에 정의된 필드 내역대로 처리하신다면 forms.ModelForm을 상속받아서 모델 폼으로 구현하시면 보다 간결하게 구현하실 수 있습니다.
ModelForm은 장고의 설계철학에 부합되는 효율적인 접근입니다.
https://docs.djangoproject.com/ko/4.0/misc/design-philosophies/#less-code-1
반드시 ModelForm을 써야한다는 것이 아닙니다. Form을 통한 처리도 많이 씁니다. ModelForm을 쓰시는 분들이 반드시 ModelForm을 써야만 장고스러운 처리라고 오해하시는 데 절대 그렇지 않습니다. 경우에 따라 forms.Form을 통한 처리도 좋은 접근입니다.
form = PostForm(request.POST, request.FILES) 코드는
- request 객체에서 요청 내역은 .GET, .POST, .FILES 속성을 통해서 접근하실 수 있습니다. 모두 대문자입니다. .Post, .Files 와 같은 이름의 속성은 없습니다.
- 위 코드를 통해 현재 요청의 모든 내역을 PostForm에 전달하여 폼 객체를 생성하는 것입니다. Post 모델과는 무관합니다. 폼을 통해 유효성 검사에 통과한 값들을 최종적으로 Post 모델을 통해 DB에 저장하실 수도 있고, DB에 저장없이 이메일 발송을 하실 수도 있고, 구현하기 나름입니다.
장고 Form은 유효성 검사를 진행하는 과정에서 유효성 검사에 통과한 값들을 .cleaned_data 사전 객체에 누적합니다. ModelForm에서는 .save 메서드가 지원되며, Form 에서는 지원되지 않습니다. 제가 24:03에 보여드린 예시는 .save 메서드를 구현한다면 이런 식으로 구현을 해볼 수도 있다라는 예시입니다.
유효성 검사에 통과한 값들로
Post 모델을 통해 새로운 Post 인스턴스를 생성코자 한다면
form.cleaned_data 사전 객체에 유효성 검사에 통과한 값들이 있다고 했을 때
ex) { "title" : "hello title" }
아래와 같이 필드 값을 하나하나 지정하실 수도 있고
post = Post(title=form.cleaned_data["title"])
post.save()
아래와 같이 사전 객체의 unpack 문법을 통해 값들을 한 번에 지정하실 수도 있습니다. 이는 파이썬 기본 문법입니다.
post = Post(**form.cleaned_data)
post.save()
화이팅입니다. :-)





