인프런 커뮤니티 질문&답변

뤀쪼님의 프로필 이미지
뤀쪼

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

User 모델에 Follow-Unfollow 관계 필드를 구현하고, Follow 기능 구현

{% url %} 리버스 관련 질문이 2개 있습니다.

작성

·

203

1

안녕하세요. url reverse 관련 질문이 있습니다.

1)

instagram/templates/instagram/index.html에서

<a href="{% url "instagram:post_new" %}"  class="btn btn-primary"> 새 포스팅 쓰기 </a>

 
이 부분은 instagram 앱의 urls.py에 있는 name 'post_new'를 참조하는데 형식이 instagram:post_new인 반면,
 
instagram/templates/instagram/timeline_sidebar_user_follow.html에서
 
<a href="{% url "user_follow" suggested_user.username %}">Follow</a>
 
부분은 user_follow 역시 instagram 앱의 urls.py에 존재하는 name인데 'instagram:'이 붙지 않는지 궁금합니다.
 
instagram: 을 지웠을 때, post_new를 찾지 못해서 NoReverserMatch가 뜨는 것은 확인했는데 'urls.py에 정의해준 app_name:'이 붙고/안 붙고의 기준을 잘 모르겠습니다.
 
2)
<a href="{% url "user_follow" suggested_user.username %}"> 형식에서 url 다음 "" 빈 칸에 오는 것이 name이고 이를 통해서 url을 넘겨주는 것으로 이해했는데, 쌍 따옴표에 들어가지 않는 인자 suggested_user.username이 넘어가는 경로가 궁금합니다.
 
이 부분은 제가 문서를 찾기가 힘들어서 관련 링크나 아니면 깃헙에서 뒤져볼 파일이나 클래스명? 을 알려주시면 참고하는데 도움이 될 것 같습니다.
 
감사합니다.

답변 1

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

1) 각 장고앱의 urls.py에 app_name 값을 설정하면, 이는 url revserse시에 namespace로서 동작을 합니다. 

instagram 앱에서도 urls.py 파일을 열어보시면 app_name = "instagram" 설정이 있을 것입니다. 그래서 instagram/urls.py 의 urlpatterns에 정의된 path에 대해서 url reverse를 하실 때에는 필히 namespace인 instagram: 을 붙여주셔야합니다. // app_name을 지정하셨다면 그 장고앱은 필히 namespace로서 그 값을 지정하셔야며, app_name을 지정하지 않은 앱은 namespace가 없는 것입니다.

2) 템플릿태그를 호출 시에 123이나 "hello"와 같이 리터럴 값을 직접 지정하는 것은 단순히 그 값을 지정하는 것이며, suggested_user 라고 쓰는 것은 현재 템플릿 시에 지정된 context data의 값을 참조하는 것입니다. suggested_user.username은 suggested_user 의 username 속성을 참조하는 것입니다.

그리고 장고 템플릿은 디폴트 설정으로 존재하지 않은 context data에 접근 시에는 오류를 발생시키지 않고, 빈 문자열로서 처리가 됨을 참고하세요.

살펴보시고 추가 질문 주세요. 해결되셨다면 해결됨으로 상태변경 부탁드립니다.

화이팅입니다. ;-)

뤀쪼님의 프로필 이미지
뤀쪼
질문자

감사합니다. 두 번째 질문에서

re_path(r'^(?P<username>[\w.@+-]+)/follow/$', views.user_follow, name='user_follow'),
<a href="{% url "user_follow" suggested_user.username %}">

이런 식으로 전달될 때는 url 주소가 넘겨준 인자/follow로 되는 반면,

공식 문서에서는

path('client/<int:id>/', app_views.client, name='app-views-client')

If this app’s URLconf is included into the project’s URLconf under a path such as this:

path('clients/', include('project_name.app_name.urls'))

…then, in a template, you can create a link to this view like this:

{% url 'app-views-client' client.id %}

The template tag will output the string /clients/client/123/.

이런 식으로 suggested_user.username 자리에 전달해 준 client.id라는 인자가 넘겨준 인자/follow처럼 넘겨준 인자/client 가 아니라 client/넘겨준 인자 로 된다는 점이 차이가 있는 점이 궁금합니다. {% url %} 기능의 어떤 부분(함수, 클래스 등...)이 이렇게 '전달되는 인자가 기입되는 부분을 알아서 찾도록 해주는지' 너무 똑똑해서 신기해서요ㅎㅎ 

P.S.미해결 창을 지금 봐서 이전 글들 모두 해결로 변경했습니다  :)

이진석님의 프로필 이미지
이진석
지식공유자

URL Reverse에서는 path/re_path에 지정된 URL 문자열을 생성해줍니다.

path("client/<int:pk>/", name="client1") 에 매칭되는 {% url "client1" 1234 %} 에서는 /client/1234/ 문자열이 만들어질테구요.

path("<int:pk>/client/", name="client2") 에 매칭되는 {% url "client2" 1234 %} 에서는 /1234/client/ 문자열이 만들어집니다.

{% url "client1" 1234 %} 와 {% url "client2" 1234 %} 는 URL 문자열이 어떻게 조합되는 지 신경쓰지 않아도, path name과 인자만 넘겨주면 되는 거죠. 우리는 어떤 path를 통해서 처리하는 지에 대해서만 신경쓰면 될 뿐, 나머지 URL 문자열 생성은 장고에서 알아서 해주는 거죠.

그러니 path route가 변경이 되어도
이전 => path("client/<int:pk>/", name="client1") 에 대해 {% url "client1" 1234 %}
이후 => path("client/<int:pk>/view/", name="client1") 에 대해 {% url "client1" 1234 %}

URL Reverse 코드는 바뀌지 않죠. :-)

그래서, 장고 내에서 뷰에 대한 URL 문자열을 모두 URL Reverse를 사용토록 하시면, 보다 간결하고 유연하게 URL 처리를 하실 수 있습니다.

뤀쪼님의 프로필 이미지
뤀쪼
질문자

감사합니다.

뤀쪼님의 프로필 이미지
뤀쪼

작성한 질문수

질문하기