작성
·
187
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를 되돌려 보내주는 작업이 연결되어있겠죠?
그걸 저희가 다시 작성하기는 번거롭기 때문에 이전에 작성되어있던 부모 클래스 메서드를 호출하는 겁니다.
답변이 도움이 되셨길 바랍니다.
좋은하루 보내시구요!
감사합니다-
설명 감사합니다. 궁금한게 있는데요 추가로.
최종적으로 super().form_valid 에서 또 form.save() 하는것 같은데, 이것 역시 실제 DB에 반영 하는 것이라면
같은 데이터를 두 번 반영하는 비효율이 생기는 것 같은데 맞나요?