[REAL Python – Django] – “Django – post 상세 페이지(FBV)”

[REAL Python – Django] – “Django – post 상세 페이지(FBV)”

2월 11, 2022

한 개의 포스트만 보여주는 페이지

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.pysingle_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와 템플릿을 위의 코드로 수정하여 링크를 달도록 하였습니다.

필자의 작업 화면.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.