인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

병주님의 프로필 이미지
병주

작성한 질문수

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

Messages Framework

21분에 error 수정하는 부분이 잘 이해가 가지않습니다.

작성

·

142

0

제가 아직 무지한 탓에 강사님께서 오류를 수정하시는 부분이 이해가 가지않더군요,,

view.py 에서 

post_new 부분에 None 추가하는부분과

post_edit 부분에 post를 추가하는 부분에 부연설명 조금 가능하실까요?

답변 1

0

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

안녕하세요.

instagram/post_form.html 내에서 {{ Post객체.get_absolute_url }}을 수행할려면, 

Post객체의 get_absolute_url 메서드 구현을 보시면, 그 역할이 현 Post객체에 대한 detail view가 호출될 수 있는 URL 문자열을 완성하는 것인데요. 이는 DB에 저장된 Post에 대해서만 수행을 할 수 있습니다. DB에 저장되지 않은 Post은 존재하지 않는 것이기에 조회할 수가 없는 거죠.

그리고 DB에 저장된 모든 모델 객체는 self.pk 값이 1이상의 자연수값을 가집니다. DB에 저장되지 않으면 None값을 가지게 되구요.

---

instagram/post_form.html 내에서 "내용으로" 링크는

  1. 새 포스팅 쓰기 시에는 보여지지 않아야 합니다.
  2. 포스팅 수정 시에는 보여져야 합니다.

그럼 "내용으로" 링크를 보여줄 지 말지를 결정하기 위해서 form.instance 값으로 if 분기를 탔었구요.

그런데, form.instance 값은 post_new 뷰를 통한 처리에서도, post_edit 뷰를 통한 처리에서도 None이 아닌 Post 객체로 값이 지정되어있었습니다. 이는 장고 ModelForm 내부적으로 구현이 그렇게 되어있는 것이구요.

  1. post_new 뷰 구현에서의 form.instance 는 Post 객체이지만, 아직 저장되지 않은 상황입니다. 그래서 템플릿에서 {% if form.instance %} 는 항상 참(True)이 됩니다. form.instance.pk 값이 None이구요.
  2. post_edit 뷰 구현에서의 form.instance 역시 Post객체이고 DB에 저장된 상황입니다. 이때에도 템플릿에서 {% if form.instance %} 는 항상 참(True)이 됩니다. form.instance.pk 값은 1 이상의 값이 되구요.

post_new 뷰와 post_edit 뷰 모두 {% if form.instance %} 는 참(True)이기에, 위에서 말씀드린 "내용으로 링크는 새 포스팅 쓰기 시에는 보여지지 않아야 합니다." 상황에 맞지 않게 됩니다.

그래서 post_form.html 템플릿에서 post_new와 post_edit 상황을 구별할 수 있도록,

  1. post_new 뷰 구현에서는 context_data로 "post": None을 지정한 것이구요.
  2. post_edit 뷰 구현에서는 context_data로 "post": post를 지정한 것입니다.

그럼 post_form.html 템플릿에서는 {% if post %} 분기는 post_edit 시에만 수행이 되어, 포스팅 수정시에만 "내용으로" 링크를 렌더링하게 됩니다.

설명이 조금 길었는 데요. 이해하시는 데에 도움이 되셨으면 합니다.

확인해보시고 추가 질문 있으시면 언제든 편히 남겨주세요.

질문이 해결되셨으면, 본 질문의 상태를 해결됨으로 변경 부탁드립니다. 이때 제목에 "[해결]"을 붙이시는 것이 아니라, 인프런 페이지에서 해결됨으로 변경하는 별도의 메뉴가 있습니다.

화이팅입니다. :-)

병주님의 프로필 이미지
병주

작성한 질문수

질문하기