본문 바로가기

About coding/Today I learned

2023년 05월 9일 TIL [#drf 게시글 만들기 CRUD #Choice #error메시지 커스텀]

 

 


오늘의 학습 계획

_에러해결 (admin 접속한 다음 board 타이틀 눌렀을 때 안 뜨는 이유): 이미 데이터를 한 번 만들었었는데, 새롭게 boardtype이라는 컬럼이 생겼으니, 기존에 있던 곳에 이 컬럼의 값 처리를 어떻게 넣을거냐는 질문을 해석하지 못해서

그 질문이 에러인줄 알았다.

 

_models.py에서 초이스 부분 어떻게 처리해야 할지. 사용자가 게시판 종류를 아무것도 선택하지 않으면 진행이 불가능하게 설정하고 싶다. > html에서 체크박스로 받는 방법으로 가는게 가장 효율적인가?:

승호님이 도와주셨는데, 우선은, 진행을 막는 방법은 디폴트값 자체가 blank=False 이므로 에러가 나게 되어 막아지고 있는 것이고, 에러메시지를 커스텀하는 방법은

models.py에서 아래와 같이 에러메시지를 사전형으로 넣어서 보내면 된다고 한다.

승호님 대박 감사

boardtype = models.CharField(max_length=20, choices = BOARD_TYPE_CHOICES, error_messages={'message':'선택을 꼭 하셔야 대영'})

 

_배포시에는 사용자로부터 이미지 파일 받는 방법을 다르게 해야 한다던데, 구체적으로 어떻게 해야 하는지 알고 싶다:

배포할 때 파일 받는 방법을 다르게 하라는 이유는, 현재의 방식대로라면 웹사이트 방문자가 업로드한 이미지파일이 우리의 media 폴더에 들어가게 되는데, 이렇게 된 상태로 AWS EC2를 통해 배포하면 이미지파일을 보관하는 디렉토리 자체가 AWS에 올라가게 되고, 이미지파일의 특성 상, 큰 용량을 사용하게 되므로 과금이 많이 될 수 있다. 때문에 추후에 nginX 등을 배운 뒤 그걸 사용해서 업로드되는 이미지들을 처리해야 한다.

 

_models.py 완성한 다음에 views.py 완성하기:

CRUD 중 CURD 완성

 

_하나의 class Board가 완성되었으면 그걸 상속받아서 3가지 models.py 만들기:

세가지 모델을 만들 필요 없이, 모든 기존 게시글들이 속성값으로 boardtype을 가지고 있으므로,

request 경로 설정에서부터 보드타입을 가지고 사용자 요청대로 특정 게시판을 받아서 view.py 클래스에서 그 특정 게시판에 해당하는 게시글들만 간추려 리스폰스 하면 되는 걸로 판명.

 


기록하고 싶은 학습내용

_어제 해결하지 못한 내용을 가지고 튜터님께 갔다.

 

문제상황: 간단히 모델스에 초이스 구현하고 슈퍼유저 만들었다. 브라우저에서 들어가려는데 오잉? 에러!

초이스 구현해놓고 마이그레이션 안해서 그런가? 해보았다.

makemigrations를 했더니 또 에러...?

choice 구현한 곳에서 default 값을 꼭 정해줘야 하나보다.

음... 인간의 언어로 내가 원하는 것을 말하자면, 난

이거 세가지 중에서 사용자가 아무것도 입력하지 않으면 게시글 작성이 안되게끔하고 싶다. 어떻게 해야하지?

튜터님께 여쭤봐야겠다.

 

해서 튜터님께 갔더니, makemigrations 저 부분에서 해결해야 한다고 하신다. 저게 디폴트값을 꼭 코딩하라는 얘기가 아니라 이미 있는 데이터에 boardtype을 추가하자니 이전 공백에 대해서 디폴트값을 어떻게 할거나고 묻는 것이므로 1번을 눌러서 진행해보자고 하심.

눌렀더니 됨 ㅋㅋㅋㅋ

그다음에 board type choice를 보여드리고, 내가 원하는 건 사용자가 3개 중에 고르지 않으면 더이상 진행이 안되고 망해버리는것이라고 말씀드렸다.

blank는 저렇게 false라고 안써도 기본이 false이니 쓸 필요 없다고 하셨고,

에러메시지는 저렇게 띄우는 것이 아니라고 하셨다.

아마도 에러메시지는 시리얼라이즈에서 설정하는 것 같은데, 혼자서 공부하며 알아보길 유도하시는 것 같다. 흑흑

일단 지우고 계속 진행해본다! 갈 길이 멀다 뷰스도 만들어야하고! 헛둘헛둘

 

_그렇게 진행진행 하다가, 고민되던 사항.

우리의 게시판은 3개. 내가 만든 게시판의 모델, 뷰, 시리얼라이저는 하나. class Board 였다.

그럼 나머지 3개는 어떻게 구현하지?

처음에는 class Board를 가지고 상속을 받아서 각 게시판마다 새로운 모델을 만들어줘야 하는 줄 알았다.

그런데 소라님이랑 다시 생각을 해보니 아이디어가 떠올랐는데, 모델/뷰/시리얼라이져 여러개 만들 필요 없을 것 같았다.

왜냐하면,

모든 게시글들은 속성값에 boardtype 이라는 것이 있어서, 3가지 보드타입 중 하나를 반드시 갖고 있게 된다.

 

유저의 입장으로 돌아가서,

우리의 웹사이트에 들어와 상호작용하는 순서대로 생각을 해보았다. 의사코드를 작성했다.

위 의사코드를 좀 더 자세히 써보면

1. 사용자는 웹사이트의 메인페이지에 들어올 것이고

2. 어떤 게시판에 접속하기 위해서 웹사이트 화면 왼쪽에 있는 카테고리란에서 게시판이름이 쓰여진 링크를 클릭할 것이다.

3. 그 순간 링크가 어떤 경로를 가지고 GET 방식으로 request 될 것이고

4. 그 링크를 urls.py에서 받아 뷰를 호출한다,

5. views.py에서 뷰 클래스는 그대로 model을 통해 데이터를 불러오게 되고,

6. 불러온 데이터를 시리얼라이져를 통해서 요리조리쿵딱쿵딱 입맛에 맞게 조리한 뒤

7. 프론트로 리스폰스하게 된다.

 

즉, 사용자와 지금까지의 우리는 게시판이 3개이면 3개의 공간이 있는 것으로 생각했는데,

프론트에서 보기에는 그렇게 구현될 지 몰라도, 게시판들의 영혼의 구성 즉, 백엔드에서는

모든 게시물들을 보드타입에 따라 분류하지 않은 채, 하나의 DB 테이블에서 보관하고 있으면 된다.

그러다가 사용자가 웹사이트 화면에서 어떤 게시판 하나를 고르면,

한 테이블에 보관하고 있던 모든 게시글들 중에 filter 처리를 해서

사용자가 고른 게시판에 해당하는 글들만 쭉 모아다가 프론트에 전달해주면 되는 것이다. 

 

여기서 승호님이 구체적으로 어떻게 코딩해야 하는지 상세하게 알려주셨다.

요점은 

1. urls.py에서 request 경로를 호출할 때, '<str:boardtype>/' 이 코드를 사용해서

 사용자가 고른 특정 게시판에 해당하는 글들만 부르도록하고.

2. views.py에서 인자값으로 boardtype을 받은 뒤, .filter(boardtype=boardtype)을 한다.

그러면 사용자가 누른 보드타입과 일치하는 게시글들만 간추려지게 되는데,

이 글들을 리스폰스하게 된다.

 

이러면 의사코드에 적었던 우리의 생각이 그대로 이루어진다!! ㅎㅎㅎ

포스트맨에서 테스트해보면 결과는 이렇게 잘 나온다.

 

요로케 경로 요청할 때 보드타입의 이름 자체가 경로에 들어가고,

결과는 이렇게!

사용자가 클릭했던 BOARDTOAWAKE 게시판에 해당하는 게시글들만 불러와진다.

후후

 

 

 

하 현재시각 1시 53분

CRUD 마쳤다.

테스트 하느라 먹통으로 해놨던 user=request.user 이런 것도 풀었다.

명일 팀원들이랑 상의할 것은, users의 닉네임을 어디부분에서 어떻게 불러와야 프론트에 전달할 수 있을지.

related_ 이거 쓰는거 같은데 내가 잘 몰라서 상의해봐야겠다.