작성
·
158
0
답변 1
1
안녕하세요.
Post 모델과 PostForm 폼은 별개입니다.
스프링이나 다른 웹프레임워크에서는 웹 요청을 처리할 때 Controller 계층 -> Service 계층 -> Repository 계층으로 나눠서 구현을 하는데요.
현재의 post_new 뷰에서
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) 코드는
장고 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()
화이팅입니다. :-)