• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

9분 56초 질문드립니다.

21.08.23 21:13 작성 조회수 130

0

def form_valid(self, form):
temp_profile = form.save(commit=False)
temp_profile.user = self.request.user
temp_profile.save()

return super().form_valid(form)

이 부분 10번 돌려봐도 무슨 말인지 전혀 모르겠습니다...

들리는 대로 다 적어봤는데,  이렇게 말씀하셨는데

무슨 말인지 전혀 이해가 안 가서 그런데 좀...

쉽게 설명 부탁드려도 될까요?

#커스텀마이징하려는 내용. 괄호안의 form forms.py에서 
날라온 데이터이며
(self, form) form에 저장된다.


#user라는 데이터가 아직 없다. temp_profile user라는 데이터를 
self
에서 request를 보는 당사자 유저로 정해준다.
 
그리고 나머지는 조상(부모클래스)의 원래 그거의
결과를
return해준다.


답변 1

답변을 작성해보세요.

1

안녕하세요.
질문 확인했습니다.

설명을 드리자면,
일단 해당 내용은 유저에게 입력받지 않았지만,
models.py 파일에 설정한 profile 의 속성 값을 지정해주기 위한 과정입니다.

위와 같은 화면을 통해 유저에게 입력을 받게 되는데,
여기에서 만드는 profile 이 어떤 유저에게 연결되어있는지는 유저에게 입력을 받지 않죠?
그래서 그 연결고리를 만들어주는 작업을 진행하는겁니다.
요청을 보낸 유저와 지금 만들어질 Profile 을 연결해주는거죠.

그 작업을 하기 위해 form_valid 메서드를 오버라이딩 하는겁니다.
form_valid 메서드는 유저가 보낸 모든 입력을 검증하고,
검증이 완료 된 이후 실행되는 메서드에요.

그러니까 정상적인 입력을 다 받았다고 확인한 이후에,
이 profile 과 연결될 유저가 누군지만 정해주는거죠.

def form_valid(self, form):
temp_profile = form.save(commit=False)
temp_profile.user = self.request.user
temp_profile.save()
return super().form_valid(form)

이때 form 이라는 변수에는 유저가 보낸 모든 입력들이 들어있습니다.
그래서  이 form 을 통해서 새로운 temp_profile 이라는 객체를 저장하되,
commt=False 옵션을 통해서 실제 DB 에 반영은 아직 안하도록 해놓는거에요.

그리고나서, temp_profile 에 설정될 user 값을 할당해주고 나서,
최종적으로 save() 메서드를 불러주고 실제 DB 에 반영시켜주는거죠.

그리고 마지막으로 불러주는 super().form_valid(form) 같은 경우에는,
원래 부모 클래스에 작성되어있는 form_valid 가 하던 작업을 그대로 다시 하는거구요.

그러니까, 원래 form_valid 메서드가 실행되고, Response를 되돌려 보내주는 작업이 연결되어있겠죠?
그걸 저희가 다시 작성하기는 번거롭기 때문에 이전에 작성되어있던 부모 클래스 메서드를 호출하는 겁니다.


답변이 도움이 되셨길 바랍니다.

좋은하루 보내시구요!
감사합니다-

장진서님의 프로필

장진서

2021.12.31

 설명 감사합니다. 궁금한게 있는데요 추가로.

최종적으로 super().form_valid 에서 또 form.save() 하는것 같은데, 이것 역시 실제 DB에 반영 하는 것이라면 

    def form_valid(self, form):
        """If the form is valid, save the associated model."""
        self.object = form.save()
        return super().form_valid(form)

같은 데이터를 두 번 반영하는 비효율이 생기는 것 같은데 맞나요?