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

김영빈님의 프로필 이미지
김영빈

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

장고 만으로 댓글 쓰기 구현

form.save() // 함수기반 뷰에 대해서 질문드립니다

작성

·

163

0

안녕하세요? 강의 잘 듣고 있습니다. 좋은 강의와 친절한 답변에 늘 감사드립니다.
 
 
1.
 
@login_required
def comment_new(request,post_pk):
post = get_object_or_404(Post,pk=post_pk)

  if request.method =="POST":
    form = CommentForm(request.POST,request.FILES)
    if form.is_valid():
      comment = form.save(commit = False)
      comment.post = post
      comment.author = request.user
      comment.save()
      return redirect(comment.post)
      #comment.post > 코멘트의 post 객체 > 해당 post의 url로 이동
  else:
    form = CommentForm()
  return render(request,"instagram/comment_form.html",{"form":form,})
 
이전에 드렸어야 할 질문인 것 같은데, 갑자기 눈에 밟혀서 질문 드립니다.
해당 강의에서 comment_new view에 관한 부분 중에,
comment = form.save(commit=False)이 부분이 좀 궁금한데요,
 
실제 모델에서는 post나 author에 대한 정보가 필요하기 때문에, 바로 commit을 하는게 아니라 해당 정보를 넣어주고 commit 해주기 위해서 commit = False와 같은 식으로 해주는 것은 이해했습니다.
궁금한 부분은,
굳이 comment = form.save()로 받아줄 필요없이 바로
 
form = CommentForm(request.POST,request.FILES)
form.post = post
form.author = request.user
form.save()
 
와 같이 해주면 안되나요??
 
2. 강의중에 몇번 말씀해주신게,'함수기반 뷰를 만들고 > 클래스기반 뷰를 활용해보는게 좋다' 와 같은 식으로 몇번말씀해주셨는데요, 함수기반뷰는 일일이 작성해줘야 하기 때문에 메커니즘을 좀 이해할 수 있어서 라고 이해를 했습니다.
 
근데 궁금한게, 그냥 함수기반뷰만 사용하면 안되나요? 장고를 사용하다보면 자연스럽게 클래스기반뷰로 넘어가는 경향이 있는지, FBV 에 비해서 CBV의 장점이 무엇인지 궁금합니다.(상속을 통한 재사용성.. 정도로 생각은 하고 있습니다!)
 
감사합니다~
 
 

답변 1

0

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

안녕하세요.

ModelForm은 Form과는 달리 save 멤버함수를 지원해줍니다.

ModelForm 클래스 내부에 instance 멤버변수를 가지고 있습니다.

https://github.com/django/django/blob/3.0.14/django/forms/models.py#L289

유효성 검사에 통과한 값들(form.cleaned_data)을 관련 모델로의 save(create or update)를 지원해주는 것이죠.

save 메서드에서는 commit=True 키워드 인자를 지원하고, commit=True일때 instance.save()를 호출한 후에 instance를 반환하고, commit=False에서는 instance.save()를 호출하지 않고 instance를 반환합니다. 꼭 아래 코드를 확인해보세요.

https://github.com/django/django/blob/3.0.14/django/forms/models.py#L459

아래의 코드에서 .post, .author 지정은 form 인스턴스에 대한 설정이 아니라 instance 멤버변수에 대한 설정입니다.

comment = form.save(commit = False)
comment.post = post
comment.author = request.user
comment.save()

그러니 아래의 코드에서 .post, .author 속성 설정이 오류가 발생하지 않더라도, 이는 instance에 .post, .author 설정을 한 것이 아닙니다. // 파이썬은 동적으로 객체에 임의의 속성을 저장할 수 있는 유연함이 있습니다. 언어적 특징이죠.

form = CommentForm(request.POST,request.FILES)
form.post = post
form.author = request.user
form.save()

---

그리고 FBV/CBV 모두 활발히 사용이 되구요. FBV로만 서비스를 개발하셔도 됩니다.

다른 장고 라이브러리를 활용할 때에는 CBV로 된 뷰들이 있으니 이를 활용하실려면 CBV에 대한 이해가 있으셔야겠죠.

CBV는 생각하신 대로 상속을 통한 재사용성을 극대화 및, 원하는 메서드만 상속을 통해 변경할 수 있다는 유연함이 있습니다.

화이팅입니다. :-)

김영빈님의 프로필 이미지
김영빈

작성한 질문수

질문하기