[Django] URL Reverse

후리붜너 2022. 11. 19. 23:55

URL Reverse

장고에서 urls.py에 경로를 입력해주고 라우팅을 해주는 과정에서 일부 설정만 해주면 해당 경로를 처음부터 입력하지 않고 그 경로의 이름만을 입력해주는 방식으로 치환이 가능하다.

위 예시처럼 urls.py에 정의한 경로인 'new/'에 <a>태그로 접근하도록 하려면 직접 경로를 작성해야하는 까다로움이 있었는데 이 문제를 URL Reverse를 사용해서 '앱이름:path이름' 식으로 변경해줄 수 있다.


URL Reverse의 기본

URL Reverse 방식은 단순하게 urls.py의 urlpatterns 속성안에 path의 인자로 name을 지정해주는 것이다. 단순히 이렇게만 이름을 지정해줘도 HTML에서 path 이름을 호출하면 해당 링크를 사용할 수 있다.

urls.py 내부 path 이름 설정
html 파일 내부 url 사용 예시

위의 코드 예시처럼 단순히 name만 지정하고 html에서 호출해줌으로써 해당 링크에 접근할 수 있다. (path를 사용하지 않아 간편)

 

문제

위처럼 간단한게 이름을 지정하면 문제가 생길 수 있다. 위 예시처럼 html에 이름을 적어놓으면 장고는 settings.py의 INSTALLED_APPS부터 차례대로 APP에 들어있는 path의 name과 비교하면서 찾게된다.

 

그러므로 만약 다른 app에 동일한 이름의 path가 존재한다면 내가 원하는 path가 아닌 다른 path가 적용될 수도 있는 것이다. 

 

해결

문제를 해결하는 방법은 간단하다. app이 달라도 괘념치않고 모든 path의 이름을 모두 다르게 하면 된다. 하지만 현실적으로 app안에서 비슷한 기능을 하는 path에는 비슷한 이름이 들어갈 것이고 이 path 이름들을 헷갈리지 않게 기억하는 것은 생각보다 귀찮은 일이다...

때문에 urls.py에 'app_name'이라는 변수를 넣어주면 해당 app_name안의 path name인것으로 인식하게 할 수 있다!!

urls.py 내부
html 내부

 

 

reverse()

reverse 메서드는 path인자와 path에 같이 들어가는 argments가 있다. 이 인자들을 받으면 reverse는 매칭되는 URL을 반환한다.

위 보기에서처럼 args(argments), kwargs(keyword argments) 모두 인자로 들어갈 수 있다.

 

argments들이 사용되는 예시는 다음과 같다.

args 인자 적용 예시
kwargs 인자 적용 예시

 

실제 URL이 반환되는 결과 예시를 보자.

resolve_url()

resolve_url은 reverse와 거의 비슷한 함수이다. 동일하게 path와 argment를 넣어주면 해당되는 URL을 반환한다. 

resolve_url 예시

다만 reverse와는 다르게 args, kwargs라는 이름의 인자를 사용하지 않고 직접적으로 인자들을 부여하는 것이 조금 다르다.

 

redirect()

redirect는 reverse, resolve_url처럼 URL을 반환해주는 메서드는 아니고 HttpResponse를 반환하는 메서드이다. 즉, redirect를 사용하면 해당 URL로 이동하는 response가 반환되는 것이다.

redirect 출력 예시


HTML 파일 내에서 장고 url 태그를 사용해서 장고 파일 내 path 경로를 줄 수 있는데 사용법은 간단하다.


get_absolute_url

get_absolute_url은 model 객체가 URL Reverse로 사용될 때 model class내부의 get_absolute_url에 명시되어 있는 url로 이동하게 해준다. 

원래대로라면 reverse, resolve_url, redirect와 같은 URL Reverse 메서드에는 경로를 나타내는 path이름이 들어가는 것이 맞고 model 객체가 들어가면 오류가 떠야한다. 다만 View함수에서 모델 객체를 사용할 때 편의성을 증대하기 위해서 get_absolute_url이라는 모델 객체가 향하는 path를 따로 기본 지정해놓은 것이다.

get_absolute_url 예시

위 코드 예시처럼 get_absolute_url을 명시하고 path를 지정해놓으면(인자도 지정할 수 있다.) URL Reverse를 객체에 사용했을 때 작동하게 된다.  

결과 예시

 


View함수에서 URL Reverse 모델 객체에 사용 예시

결국 위의 View함수에서 일련의 처리과정을 거치고 post 객체를 redirect 메서드에 넣어주면 동시에 get_absolute_url이 반환되면서 생성된 post의 detail 페이지로 이동하게 된다.