[Django] url reverse์™€ get_absolute_url()

cdwdeยท2021๋…„ 4์›” 4์ผ
1

Django

๋ชฉ๋ก ๋ณด๊ธฐ
9/13

๐ŸŒ ๋ณธ ํฌ์ŠคํŠธ๋Š” ๋ฆฌ์•กํŠธ์™€ ํ•จ๊ป˜ ์žฅ๊ณ  ์‹œ์ž‘ํ•˜๊ธฐ Complete + ๋ณ„๋„๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค

๐ŸŽˆ URL Dispatcher

urls.py ๋ณ€๊ฒฝ๋งŒ์œผ๋กœ๋„ ๊ฐ ๋ทฐ์— ๋Œ€ํ•œ URL์ด ๋ณ€๊ฒฝ๋˜๋Š” ์œ ์—ฐํ•œ URL ์‹œ์Šคํ…œ


๐ŸŽˆ URL Reverse๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” 4๊ฐ€์ง€ ํ•จ์ˆ˜

1. url template tag

  • ๋‚ด๋ถ€์ ์œผ๋กœ reverse ํ•จ์ˆ˜ ์‚ฌ์šฉ
<a href= '{% url "blog:post_detail" post.id %}'>{{post.message}}</a>

2. reverse()

  • ๋งค์นญ url์ด ์—†์œผ๋ฉด NoReverseMatch
  • ๋ฆฌํ„ด: string
from django.urls import reverse

reverse('blog:post_detail', args = [100])
reverse('blog:post_detail', kwargs = {'pk':100})

reverse('blog:post_detail)	#NoReverseMatch

3. resolve_url()

  • ๋‚ด๋ถ€์ ์œผ๋กœ reverse ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • reverse()๋ณด๋‹ค ์‚ฌ์šฉ ๊ฐ„๋‹จ
  • ๋ฆฌํ„ด: string
from django.shortcuts import resolve_url

resolve_url('blog:post_detail', 100)
resolve_url('blog:post_detail', pk=100)

4. redirect()

  • ๋‚ด๋ถ€์ ์œผ๋กœ resolve_url() ์‚ฌ์šฉ
  • view ํ•จ์ˆ˜ ๋‚ด์—์„œ ํŠน์ • url๋กœ ์ด๋™ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ
  • ๋ฆฌํ„ด: HttpResponseRedirect
from django.shortcuts import redirect

redirect('blog:post_detail', 100)
redirect('blog:post_detail", pk=100)

# <HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/blog/100/">

๐ŸŽˆ get_absolute_url()

์–ด๋–ค ๋ชจ๋ธ์—์„œ Detail๋ทฐ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ, Detail๋ทฐ์— ๋Œ€ํ•œ URLConf ์„ค์ •ํ•˜์ž๋งˆ์ž
get_absolute_url ์„ค์ •ํ•˜๊ธฐ

  • resolve_url(๋ชจ๋ธ์ธ์Šคํ„ด์Šค), redirect(๋ชจ๋ธ์ธ์Šคํ„ด์Šค)๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค์˜ get_absolute_url() ํ•จ์ˆ˜ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ

  • resolve_url ํ•จ์ˆ˜๋Š” ๋จผ์ € get_absolute_url() ํ•จ์ˆ˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ณ 
    ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ reverse๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ๊ทธ ๋ฆฌํ„ด๊ฐ’์„ ์ฆ‰์‹œ ๋ฆฌํ„ด

def resolve_url(to, *args, **kwargs):
  # ...
  if hasattr(to, 'get_absolute_url'):
    return to.get_absolute_url()
  # ...

get_absolute_url()์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
resolve_url('blog:post_detail', pk=post.pk) => resolve_url(post)
redirect('blog:post_detail', pk=post.pk) => redirect(post)
{% url 'blog:post_detail' post.pk%} => {{ post.get_absolute.url }}


์˜ˆ์‹œ 1

  • models.py
from django.urls import reverse

class Post(models.Model):
  #...
  def get_absolute_url(self):
    return reverse('instagram:post_detail', args=[pk.self])
  • instagram/post_list.html
<a href ={{post.get_absolute_url}}>{{post.message}}</a>

์˜ˆ์‹œ 2

์ฐธ๊ณ 
https://wayhome25.github.io/django/2017/05/05/django-url-reverse/

0๊ฐœ์˜ ๋Œ“๊ธ€