[REAL Python – Django] – “Django – post 상세 페이지(FBV)”
[REAL Python – Django] – “Django – post 상세 페이지(FBV)”
한 개의 포스트만 보여주는 페이지
path('<int:pk>/', views.single_post_page),
위의 줄을 만들어두었던 urls.py
에 추가해 주었습니다.
'<int:pk>/'
부분을 이해하는 데에 어려움이 있었는데, https://docs.djangoproject.com/en/4.0/topics/http/urls/ 에서 힌트를 찾을 수 있었습니다. 위의 코드의 의미는 아래와 같이 나와 있습니다.
To capture a value from the URL, use angle brackets.
Captured values can optionally include a converter type. For example, use
<int:name>
to capture an integer parameter. If a converter isn’t included, any string, excluding a/
character, is matched.URL에서 값을 캡처하려면 꺾쇠 괄호를 사용합니다.
캡처된 값은 선택적으로 변환기 유형을 포함할 수 있습니다. 예를 들어 정수 매개변수를 캡처하려면 <int:name>을 사용하세요. 변환기가 포함되지 않은 경우 / 문자를 제외한 모든 문자열이 일치합니다.
'<int:pk>
‘ 부분은 int
형을 pk
라는 변수에 담는다는 의미라고 합니다. path('<int:pk>/', views.single_post_page)
코드의 의미는 정수형 값을 pk
라는 변수에 담고 views.py
의 single_post_page
함수에서 처리하라는 것입니다.
blog/숫자
의 형태의 url로 사용자가 접근하면, single_post_page
함수에서 이를 처리하게 됩니다.
def single_post_page(request, pk): # pk도 매개변수로 받음.
post = Post.objects.get(pk=pk) # pk가 매개변수로 받은 pk와 같은 레코드를 가져와라! 라는 의미
# pk는 primary key
return render(
request,
'blog/single_post_page.html',
{
'post':post, # 위에서 받아온 레코드
}
)
single_post_page
함수를 위와 같이 정의해 주고, 임의의 템플릿 파일을 작성하고 실행해 보았더니 다음과 같이 성공적으로 하나의 포스트가 뜨는 것을 확인할 수 있습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>{{ post.title }} - Blog</title> <!-- 레코드 접근하기 --!>
</head>
<body>
<nav>
<a href = "/blog/">Blog</a>
</nav>
<h1>{{ post.title }}</h1> <!-- 레코드 접근하기 --!>
<h4>{{ post.created_at }}</h4> <!-- 레코드 접근하기 --!>
<p>{{ post.content }}</p> <!-- 레코드 접근하기 --!>
<hr/>
<h3>Comments</h3>
</body>
</html>
post마다 링크 달기
def get_absolute_url(self):
return f'/blog/{self.pk}'
<h2><a href="{{ p.get_absolute_url }}">{{ p.title }}</a></h2>
models.py
와 템플릿을 위의 코드로 수정하여 링크를 달도록 하였습니다.