본문 바로가기

TIL

[TIL 2024 04. 16] 개인과제 오류 수정

django강의를 따라가다가 발생했던 주요한 오류 수정들을 정리해본다.

 

댓글 삭제 url경로

댓글 삭제 기능을 만드는 과정에서 계속 NoReverseMatch Error가 발생했다.

그래서 views, article_detail.html(여기에 댓글 삭제 버튼이 있음)을 모두 봤지만 문제점을 찾지 못했다.

 

NoReverseMatch Error

 

 

그러던 중에 오류 자체가 "url name을 기반으로 실제 url을 찾을 수 없다"는 것임에 미루어 urls를 시작으로 views, article_detail.html로 로직을 쭉 따라가다보니, 오류의 원인을 알 수 있었다.

 

오류의 원인은 url경로를 애초에 잘못 계획해서 지정했기 때문이었다.. url지정 당시에 댓글 삭제 기능도 댓글 생성 기능이랑 유사할 것이라고 생각해서 무심코 'articles/<int:pk>/comment_delete'로 지정했었다.

 

그런데 댓글 생성 기능은 그냥 바로 DB에 저장만 하면 되는 것과 달리 댓글 삭제 기능은 views함수의 매개변수로 '게시물의 pk', '댓글의 pk' 모두를 넘겨줘야 한다. 왜냐하면 특정한 게시물 상세 페이지 내에 그에 대한 모든 댓글들의 조회,생성, 삭제가 되기 때문이다. 즉, 각 게시물에 대한 댓글의 생성, 삭제 버튼은 해당 게시물의 상세 페이지에 있다.

 

잘못된 url경로 지정
수정한 url경로 지정

 

 

이제 수정된 url경로에 따른 요청 처리 흐름은 다음과 같다

 

1. 게시물 상세 페이지에서 어느 댓글의 삭제 '버튼'을 누른다(POST요청_댓글 '삭제'는 DB 변경하라는 요청이니까.)

 

2. urls에서 해당 url경로로 요청이 들어오면 views의 comment_delete뷰로 요청을 토스한다.

사실 엄밀히 말하면 댓글 삭제 버튼의 form action은 url name인 'comment_delete'를 가리킨다. 즉, url name을 기반으로 실제 url을 찾아서 요청을 하는 것이다. (->여기가 오류 발생 지점! 여기서 터졌었다..)

(이때, veiw함수로 넘겨주는 parameter(매개변수)는 pk와 comment_pk다)

 

3. comment_delete뷰에 따라 로직을 처리하고, article_detail.html로 리다이렉트한다.

 

아래에서 각 단계에서 함께 넘겨주는 변수 혹은 매개변수가 뭔지 잘 확인할 것!

#article_detail.html: 처리 흐름 (1) 삭제 버튼 누름
#urls.py: 처리 흐름(2) urls에서 veiws로 토스
#views.py: 처리 흐름 (3) view함수에서 로직 처리

 

 

오늘의 교훈은 url경로를 지정해줄 때는 수행하게 될 로직을 꼼꼼히 따져서 처음부터 잘 계획해서 지정해주자는 것..!


인터프리터 경로 재설정

custom user model을 사용해보던 중에 UserCreationForm을 수정하기 위해 ctrl+클릭으로 소스 코드를 따라가보던 중 강의에서 튜터님이 보시던 거랑 내가 보는 코드가 전혀 다르다는 것을 알게 됐다.

 

혹시나 싶어 강의대로 쭉 따라가보며 코드를 작성했지만 오류가 발생했고, 나는 그게 django가 제대로 import되지 않아서라고 생각했다. 왜냐하면 vscode상에서 패키지 미설치 상태에 나타나는 노란밑줄이 from, import란에 되어 있었기 때문이다. 구글링해보니 이는 가상환경이 제대로 설정이 안됐거나, 인터프리터 경로가 잘못 설정되어 있기 때문임을 알게 됐다.

 

튜터님께도 질문을 드린 결과,

 

1. 일단 가상환경의 위치는 문제가 아님

난 .venv인 가상환경이 프로젝트 디렉토리(my_first_pjt) 바깥인 django디렉토리에 있어서인가 했지만, 사실 가상환경이 활성화만 되어있다면 상관이 없는 거였다. 실제로 django에서 .venv를 활성화하고 다시 프로젝트 디렉토리로 들어와서 pip list를 실행해봐도 django가 버전 4.2로 잘 조회됐다.


2. 파이썬 인터프리터 경로

나는 python 3.10.11 64-bit으로 잘 표시되니 괜찮다고 생각했는데, 이게 python 3.10 ('.venv':venv)와 같이 가상환경이 적용된 인터프리터로 표시되도록 해줘야 하는 거였다. 이를 위해서는 인터프리터 경로 입력 > 찾기 > django dir안의 .venv dir내에서 python의 위치를 찾아줘야 했다. (참고로 나는 .venv/Scripts/python파일이 있었다)

 

 

 

(+) vscode를 완전 재시작해줘야 함!