NoReverseMatch at 에러 - Reverse for 'detail' with keyword arguments '{'pk': 1}' not found

장서연·2021년 9월 3일
0
# accountapp/urls.py

urlpatterns = [
    path('create/', AccountCreateView.as_view(), name='create'),

    path('login/', LoginView.as_view(template_name='accountapp/login.html'), 
    					      name='login'),
    path('logout/', LogoutView.as_view(), name='logout'),

    path('hello_world/', hello_world, name='hello_world'),

    path('detail/', AccountDetailView.as_view(), name='detail'),
]

위 코드와 아래 코드의 차이점이 보이는가?

# accountapp/urls.py

urlpatterns = [
    path('create/', AccountCreateView.as_view(), name='create'),

    path('login/', LoginView.as_view(template_name='accountapp/login.html'), 
    					      name='login'),
    path('logout/', LogoutView.as_view(), name='logout'),

    path('hello_world/', hello_world, name='hello_world'),

    path('detail/<int:pk>', AccountDetailView.as_view(), name='detail'),
]

그렇다. detail/ 뒤에 <int:pk> 가 있고, 없고의 차이만이 존재한다.
당연히 첫번째 코드처럼, <int:pk>값을 주지 않고 detail 로 접속하면 에러가 날 것이다. 그러나, detail 뿐만 아니라 다른 모든 url 에서도 에러가 나게 된다.

account/create 로 접속해도 동일한 에러가 뜨는 이유는 다음과 같다.
위 에러 메시지를 보면, 템플릿을 렌더링하는데 에러가 있다고 뜬다.
템플릿 내용을 자세히 보면, 유저가 로그인되어있을 때 My page 라는 링크를 보이게 하는데, 이 링크는 현재 로그인 되어있는 유저의 pk값을 가지고 detail로 향한다.
근데 템플릿 렌더링 도중 유저의 pk값을 받아오려고 하니, 찾을 수가 없어서 뜨는 에러인 것 같다. 만약 urls.py에서 detail/< int : pk> 라고 명시해 줬다면 그 값을 제대로 읽어 위 링크의 패턴에 매칭이 되는데, 나는 그걸 안써줬으니까 위 링크에 매칭이 되지 않아서 발생하는 에러인 것이다.

딸랑 < int : pk> 이거. 이 부분 하나 안써줬을 뿐인데 전체 페이지가 작동이 안되는 매직...
header.html 을 전체 페이지에서 가져와 쓰기 때문에, 전체 페이지가 작동이 안되었던 것이다.

교훈 : 부분적인 문제만 생길 것이라고 예상되어도, 사실 그 "작은" 부분을 다른 모든 페이지에서 가져와 쓰기 때문에 전체 문제가 생기는 참사가 발생한다. 그러니 항상 근본부터 생각해보자.

0개의 댓글