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
'개발일지 > Django' 카테고리의 다른 글
Django - TemplateSyntaxError(해결, html태그의 짝이 맞아야한다.) (0) | 2023.01.18 |
---|---|
Django - TypeError: expected str, bytes or os.PathLike object, not list (0) | 2023.01.16 |
Django - 장식자(Decorator) - (로그인관련) (1) | 2023.01.14 |
Django - 다인수 vs 다인수 (many to many, 다대다) 해결방법 (0) | 2023.01.10 |
Django -django-debug-toolbar 설치 및 활용 문제 해결! (0) | 2023.01.09 |