icon picker
애플리케이션 확장하기

블로그 게시글이 각 페이지마다 보이게 만들어봅시다!

Post에 템플릿 링크 만들기

blog/templates/blog/post_list.html파일에 링크를 추가하는 것부터 시작합시다. 아래와 같이 보일 거에요. :
blog/templates/blog/post_list.html
{% extends 'blog/base.html' %}

{% block content %}
{% for post in posts %}
<div class="post">
<div class="date">
{{ post.published_date }}
</div>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
{% endblock %}
post제목 목록이 보이고 해당 링크를 클릭하면, post상세 페이지로 이동하게 만들어 볼 거에요.
<h1><a href="">{{ post.title }}</a></h1>부분을 수정해 봅시다.
blog/templates/blog/post_list.html
<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
{% url 'post_detail' pk=post.pk %}을 설명할 때가 왔군요!
{% %}는 장고 템플릿 태그을 말합니다.
blog.views.post_detailpost_detail 경로입니다.
viewsviews.py파일명이에요.
마지막 부분 post_detailview 이름입니다.
pk = post.pk이란 무엇일까요?
pk는 데이터베이스의 각 레코드를 식별하는 기본키(Prmiary Key)의 줄임말 입니다.
Post 모델에서 기본키를 지정하지 않았기 때문에 장고는 pk라는 필드를 추가해 새로운 블로그 게시물이 추가될 때마다 그 값이 1,2,3 등으로 증가하게 됩니다.
아직 post_detail 뷰를 만들지 않아 오류가 날거에요!
no_reverse_match2.png

Post 상세 페이지 URL 만들

post_detail가 보이게 urls.py에 URL를 만들어 봅시다!
첫 게시물의 상세 페이지 URL 되게 만들 거에요.
blog/urls.py파일에 URL을 만들어, 장고가 post_detail 로 보내, 게시글이 보일 수 있게 해봅시다.
path('post/<int:pk>/', views.post_detail, name='post_detail')코드를 blog/urls.py파일에 추가하면 아래와 같이 보일 거에요.
blog/urls.py
from django.urls import path
from . import views

urlpatterns = [
path('', views.post_list, name='post_list'),
path('post/<int:pk>/', views.post_detail, name='post_detail'),
]
여기서 post/<int:pk/>/는 URL 패턴을 나타내요.
이제 뷰를 추가해볼거에요!

Post 상세 페이지 내 뷰 추가하기

에 매개변수 pk를 추가해봅시다.
pk를 식별해야겠죠? 그래서 함수를 def post_detail(request, pk):라고 정의합니다.
urls(pk)과 동일하게 이름을 사용해야 합니다. 변수가 생략되면 오류가 날 거예요!
이제 views.py파일에 새로운 를 추가합시다!
blog/views.py파일을 열고, from으로 시작하는 행에서 다음과 같이 코드를 추가해주세요. :
blog/views.py
from django.shortcuts import render, get_object_or_404
그리고, 파일 마지막 부분에 를 추가하세요.
blog/views.py
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
이제 잘 나올거에요!
post_list2.png
그런데 블로그 제목 링크를 클릭하면 어떻게 되나요?
template_does_not_exist2.png
이제 템플릿을 추가할 차례에요!

Post 상세 페이지 템플릿 만들

blog/templates/blog 디렉터리 안에 post_detail.html라는 새 파일을 생성하고 아래와 같이 코드를 작성하세요.
blog/templates/blog/post_detail.html
{% extends 'blog/base.html' %}

{% block content %}
<div class="post">
{% if post.published_date %}
<div class="date">
{{ post.published_date }}
</div>
{% endif %}
<h1>{{ post.title }}</h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endblock %}
다시 한 번 base.html을 확장한 거에요.
가장 중요한 부분은 {% if ... %} ... {% endif %}라는 템플릿 태그인데, 내용이 있는지 확인할 때 사용합니다.
content블록에서 블로그 글의 게시일, 제목과 내용을 보이게 만들었어요.
post게시일(published_date)이 있는지, 없는지를 확인하는 거에요.
이제 페이지를 새로고침하면 페이지 찾을 수 없음(Page not found) 페이지가 없어졌어요!
post_detail2.png
잘 돌아가네요!
Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.