본문 바로가기
개발일지/Django

Django - No Comment matches the given query. - 해결

by 개발에정착하고싶다 2022. 12. 22.

음.. 아직도 결과론적으로 보는 urls의 path는 왜 이렇게 되었는지 짐작이 가능하다.

하지만 이것을 끝에서 부터 보는 관점이 아니라 처음으로 돌아가서 구현한다고 생각한다면

솔직히 모르겠다.

그래서일까? 일단 책을 따라하고는 있는데, 책에서 아직 제시를 안해준것인지 아니면 내가 오류를 잡지 못한것인지

답변에 대한 댓글을 달려고 하면 404에러가 뜬다.

(해결이 되는대로 해결이 되었다고 수정할 예정이다.) - 해결완료


#1 문제 발견

표시된 부분의 답글 코멘트 버튼을 누르게되면

이런 에러가 떴다.

두번째 나온 힌트를 보니 무조건 경로 문제다.


#2 원인 분석

 

경로에 대한 문제라면 크게 생각할 수 있는 부분이

1)내가 직접적으로 입력되는 코드. 이를테면 urls.py의 path에서 a/b/c/<int:id>/ 이런게 잘못되었거나

2)간접적인 코드로써 urls의 path로 전달되는 역할을 하는 인자를 구성하는 요소들을 내가 잘못 꾸몄을 가능성이 있다고 생각이 들었다.


#3 원인 찾아가기

 

1) 우선 urls.py로 향했다.

그리고 다른건 볼필요도 없이 넓게 잡아봐야 "답변 댓글 추가"path를 확인하면 되는 것이였다.

그리고 나의 답변 댓글 추가 path코드는 이러했다.

# 답변 댓글 추가
    path('comment/create/answer/<int:answer_id>/',
         views.comment_create_answer, name="comment_create_answer"),

그리고 이 코드를 선생님의 깃허브 코드와 대조를 해봤다. 일치한다. 그러면 코드 자체는 문제가 아니니깐 다음으로는 views중에서 comment가 정리된 파일에 가준다.

 

2) views 코드 확인

@login_required(login_url='common:login')
def comment_create_answer(request, answer_id):
    """

    Submit pybo answer's comment
    """
    answer = get_object_or_404(Answer, pk=answer_id)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.author = request.user
            comment.create_date = timezone.now()
            comment.answer = answer
            comment.save()
            return redirect('pybo:detail', question_id=comment.answer.question.id)

    else:
        form = CommentForm()
    context = {'form': form}
    return render(request, 'pybo/comment_form.html', context)

이런 코드였는데 이것 또한 선생님의 깃허브 코드와 비교했을때 문제가 될만한걸 발견하긴 했다.

2개의 리턴중에 먼저나오는 리턴의 question_id값으로 설정된 시작점이 comment가 아니라 commit이였다.

따라서 comment가 맞는것이였기에 고쳐줬다.

하지만 여전히 경로 에러가 발생했다.

무엇이 문제일까?

완성까지는 이제 40여 페이지가 남았는데 그동안에 안나오면 아무튼 뭐가 문제가 있어도 있는것이니깐 수시로 찾아보자.


#3 작성 후 관찰

이 사진이 urls.py의 path들이고 이전의 경험을 바탕으로 정상적인 코드는 위 2개와 같이 views.다음이 파란색으로 뜨지만

3번째부터 5번째까지는 비정상적이여서 그런가 빨간색으로 되어있다. 무언가 있다.


#4 관찰결과를 토대로 시도

 

우선 로그인 후에 답변에 대한 댓글을 추가, 변경, 삭제 모두 해보았다.

정상적으로 작동이 된다.

 

현재 문제가 되는 것은 "비로그인"상태에서 답변에 대한 댓글을 남기려고 하면 - 로그인 화면으로 이동이되고 - 로그인을 하고나서 - 리디렉션이 되는 화면이 page not found가 되는거니깐

로그인 후의 redirection이 문제인가? 생각해보자면 또 일반적인 경로에서의 로그인을 하면 잘 된다.

즉, 가설을 세웠을때 일반 로그인 버튼 - 로그인 후에 떨어지는 리디렉션이랑

답변에 대한 댓글을 남기고 싶은 사람이 - 로그인 화면으로 이동이 된 후에 로그인하고 이동되는 리디렉션이랑 다른지를 비교해보자.

일단은 나머지 작업은 다음번에.


#5 결론

 

미제로 남겨놓으려고 한다.

이유는 예상되는 범위의 모든 페이지의 코드들을 강사님의 코드와 비교해보았는데 다르지가 않았다.

본디 login이 되면 메인 화면으로 돌아가게끔 settings.py에

LOGIN_REDIRECT_URL = '/'

이렇게 추가되어있었는데,

비로그인 상태에서 게시글 이동 - 답변에 코멘트 달기 - 로그인화면 - 로그인완료를 하면 리턴되는 url경로가

http://localhost:8000/pybo/comment/delete/answer/2/

이렇게 나오는데, 이 경로는 pybo 앱단위에서 - comment를 조작하는 것중 - 삭제를하는것이고 - 질문에 대한 comment가 아닌 답변에 대한 comment를 조작하는 것에 관한 경로이다.

그리고 어딘가에 이와 관련된 셋팅은 있겠지만, 나의 실력이 그정도는 아니다.

언젠가 나의 실력이 저 경로를 조작할 수 있는 수준이 되면 그때다시한번 해결을 해봐야겠다.


#6 그 후

 

오~~!!! 저자님께 질문을 남겼었다.

전혀 눈치채지 못했었는데. 내가 올린 사진중에 첫번째로 나오는 page not found 404에러에 관련된 페이지를 보자면

1부터 15까지의 url 구조가 나와있다.

그리고 13번과 15번을 보면 동일한 이름으로 name="comment_create_answer"

이라고 되어있다.

게다가 13번은 create가 맞는데, 15번은 delete가 맞는 name이다.

이에 따라서

pybo/urls.py

의 comment_delete_answer에 대해서는 name을 comment_delete_answer

로 재설정 해주었다.

 

그랬더니 이제 정상작동된다. ㅠㅠㅠㅠㅠㅠ 너무너무 감사합니당