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

Django - URL Reverse와 get_absolute_url()의 관계

by 다니엘의 개발 이야기 2023. 1. 14.
320x100

#1 개요

 

# django/shortcuts.py

def resolve_url(request, *args, **kwargs):
	if hasattr(request, 'get_absolute_url'):
    	return request.get_absolute_url()
        
    try:
    	return reverse(request, args = args, kwargs = kwargs)
    except NoReverseMatch:

기본적으로 resolver_url은 위의 코드와 같이 생겼다.

즉, resolve_url함수는 가장먼저 get_absolute_url()함수의 존재 유무를 체크하고

존재할 경우 reverse를 수행하지 않고 그 리턴 값을 반환한다.


#2 연계기능

 

from django.urls import reverse

class Post(models.Model):
	def get_absolute_url(self):
    	return reverse('<app_name>:post_detail', args = [self.id])

이런식으로 사용이 된다고 하니,

모델 클래스를 정의해 줄때는 get_absolute_url을 먼저 정의해주는게 좋다고 한다.


#3 결론

 

아무튼 장고 url 패턴을 끌고 오는 방법은 크게 2가지가 있다.

#1 URL Reverse

{% url 'gram:post_detail' post.pk %}

이 경우에는 urls.py에 url 경로를 지정할때 보통의 경우에

path('', views.post_list, name='post_list'),

이런식으로 name을 지정해 주어야 URL Reverse가 사용이 가능하고 

#2 get_absolute_url

{{ post.get_absolute_url }}

이 경우에는

class Post(models.Model):
	def get_absolute_url(self):
        return reverse('gram:post_detail', args=[self.id])

이런식으로 모델을 정의할때 내부 요소로 get_absolute_url을 정의해주어야한다.

 

그냥 쓰기에는 둘다 같아보이지만 결과적으로는 후자의 get_absolute의 방법이 선호된다.

그 이유는 url을 불러오는 html의 위치가 많아질수록, 일일이 찾아서 수작업으로 전자는 변경해줘야하는 반면,

후자의 경우에는 모델에 정의되어있는 get_absolute_url 내부의 링크만 변경해주면 된다.

300x250