inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

장고 만으로 댓글 쓰기 구현

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

220

김영빈

작성한 질문수 49

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의 장점이 무엇인지 궁금합니다.(상속을 통한 재사용성.. 정도로 생각은 하고 있습니다!)
 
감사합니다~
 
 

react django python docker

답변 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는 생각하신 대로 상속을 통한 재사용성을 극대화 및, 원하는 메서드만 상속을 통해 변경할 수 있다는 유연함이 있습니다.

화이팅입니다. :-)

안녕하세요.

0

62

1

[OneToOne Field Demo] get_user_model() 메서드를 활용해야 하는 이유?

0

285

1

useEffect 훅에서 else 유무에 따른 결과

0

222

1

useAxios 훅의 dependency array 설정

0

254

1

useEffect에서 변수 업데이트 관련 질문

0

391

1

rest_framework.generics.CreateAPIView의 model 속성 유무

0

277

1

bootstrap4

0

481

4

리뉴얼 강의가 오픈이 되면 기존 강의는 더이상 못보는걸까요

1

374

1

admin form에서 앞선 필드 선택 후 다른 필드 select widget 구성하는 방법

0

579

3

useState는 필수일까요?

0

272

1

python manage.py makemigrations instagram 시 created_at default 오류가 발생합니다.

0

611

4

Django allauth를 사용한 소셜 로그인 시 에러

0

660

1

프로젝트명 변경 뒤, 디버그툴바+디버그모드 사용 시 에러

0

569

2

useLocalStorage() 함수 사용여부

0

238

1

django에 LOGIN_URL = '/accounts/login/'의 의미?

0

454

1

리듀서의 의미 재확인

0

439

1

simple-jwt Refresh Token 사용 노하우

0

908

2

docker compose 를 통한 배포 관련 오류 문의

0

687

1

파이썬 속도 장고 관련 궁금한게 있습니다.

0

373

1

is_like_user

0

238

1

related_name 오류

0

278

1

re_path 오류

0

266

1

re_path url

0

255

1

No post matches the given query

0

671

2