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

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

작성한 질문수

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

프로필 수정 구현과 장고3에서 추가된 TextChoices 활용

view.py form에 관한부분에 대해 질문입니다.

작성

·

144

0

안녕하세요? 좋은 강의와 답변에 늘 감사드립니다.
 
강의를 들으면서 살짝 헷갈리는 부분이 있어 질문 드립니다.
@login_required
def profile_edit(request):
  if request.method == "POST":
    form = ProfileForm(request.POST,request.FILES,instance=request.user)
    #request.Post,request.Files라고 되어 있어야 post메서드와 files를 받을 수 있음
     
    if form.is_valid():
      form.save()
      messages.success(request,"프로필을 수정/저장했습니다")
      return redirect('profile_edit')
  else:
    form = ProfileForm(instance=request.user)

  return render(request,"accounts/profile_edit_form.html",{"form":form})
ProfileForm은 forms.py에서 설정된 모델폼입니다.
1.
form = ProfileForm(request.POST~) 라고 되어 있는 부분을
 
'해당 폼에서(실제 브라우저에서) 내용이 채워지고 제출되었을 떄, post메서드로 들어온 부분(request.POST)이나 파일(request.FILE)로 값들이 지정된 Profileform을 form으로 삼겠다 '라고 이해하고 있었는데
 
, instance=request.user부분이 좀 헷갈립니다.
instance=request.user가 어떤 의미로 사용된 것인가요?(왜 사용된 것인가요?)
 
2.form = ProfileForm(request.POST~)
에서보면, form은 ProfileForm의 인스턴스인데,
그렇다면 form.save()를
ProfileForm의 양식에 맞게 채워진 form의 내용을 한행의 데이터로써 db에 저장한다? 정도의 느낌으로 받아들여도 될까요?
 
 
 

답변 1

0

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

안녕하세요.

장고폼에서는 각 폼 필드의 초기값을 지정해줄 수 있는 기능이 있습니다.

  • models.Form 기반 클래스에서는 initial 키워드인자에 dict으로 초기값들을 지정할 수 있습니다.
  • models.ModelForm 기반 클래스에서는 instance 인자를 사용합니다. 수정할 모델 인스턴스를 지정합니다. instance 인자를 지정하면 <지정된 인스턴스에 대한 업데이트>으로서 동작하고, 지정하지 않거나 None으로 지정하면 <관련 인스턴스에 대한 생성>으로서 동작합니다.

본 영상에서는 ProfileForm 은 User 모델 기반의 ModelForm으로 정의를 했습니다.

class ProfileForm(forms.ModelForm):
class Meta:
model = User
fields = ["first_name", "last_name", "website_url", "bio"]

그러니 프로필 수정 시에는 수정할 User 모델의 인스턴스로서 request.user를 지정한 것입니다.

화이팅입니다. :-)

김영빈님의 프로필 이미지
김영빈
질문자

*댓글의 질문이 더 혼란스럽게 느껴질 것 같아 삭제하겠습니다 ㅠㅠ

수정할 모델의 인스턴스 = 수정할 모델의 db한행

-모델폼에서 수정할 모델의 인스턴스를 설정해 준다는 것 >> 수정할 모델db중 한행을 선택해준다는 것

-모델폼에서 수정할 모델의 인스턴스를 설정해주지 않음 >> 수정할 모델 db에 새로운 행(인스턴스)를 생성

 

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

예. ModelForm도 initial 인자를 지원합니다만, instance 인자를 활용하면 보다 손쉬운 처리가 가능해지죠.

김영빈님의 프로필 이미지
김영빈
질문자

감사합니다~

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

작성한 질문수

질문하기