오늘의 학습 계획
_에러해결 (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_ 이거 쓰는거 같은데 내가 잘 몰라서 상의해봐야겠다.
'About coding > Today I learned' 카테고리의 다른 글
2023년 05월 11일 TIL [#drf 팔로잉 팔로워 기능] (0) | 2023.05.11 |
---|---|
2023년 05월 10일 TIL [#drf foreignkey 사용하여 앱 간 데이터 공유] (0) | 2023.05.10 |
2023년 05월 8일 TIL [#drf 팀프로젝트 #S.A문서 #협업할 때 users 없이 개발하기] (0) | 2023.05.08 |
2023년 05월 3일 TIL [#AWS #DRF] (0) | 2023.05.03 |
2023년 05월 2일 TIL [#AWS 회원가입 #AWS 리젼 #AWS 콘솔] (0) | 2023.05.03 |