728x90
SMALL
Post show page를 만들기 위해서
1. Show page에 대한 URL를 만들기
2. Views 파일에 post_show 정의 해주기
Show URL
간단하게 url.py에 urlpatterns에 path를 추가해준다.
#blog/url.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='homepage'),
path('post/index/',views.post_index, name='post_index'),
path('post/<int:pk>/show/', views.post_show, name='post_show'),
]
그리고 view 파일에서 post_show를 정의해주고 index에서 show에 대한 link를 생성해주면 된다.
link 만들기
#blog/post_index.html
{% extends 'blog/base.html' %}
{% block content %}
{% for post in posts %}
<div class="post">
<div class="date">
{{post.published_date}}
</div>
<h1><a href="{% url 'post_show' pk=post.pk %}">{{ post.title }}</a></h1> <!--{% %}는 장고 템플릿 태그-->
<p> {{post.content|linebreaksbr}} </p>
<h5> author : {{ post.author }} </h5>
</div>
<hr/>
{% endfor %}
{% endblock %}
위 코드를 보면 {% url '[pst_show' pk=post.pk %} 로 link를 생성했다. 여기서 post_show는 view 이름이다.
그럼 pk = post.pk는 무엇인가?
pk는 DB의 각 record를 식별하기 위한 Primary Key의 줄임말이다.
Post model에서 기본키를 지정하지 않았기 때문에 장고는 pk 라는 필드를 추가해서
새로운 게시물을 만들 때마다 그 값이 1부터 1씩 증가하게 된다.
pk는 post.pk로 접근가능하다.
따라서 위의 url에서 <int:pk> 를 함으로써, 각 주소는 post/1/show, post/2/show 와 같이 된다.
View내의 post show정의
show page
완성!!
Error 처리
위와 같이만 처리하면 pk에 해당하는 부분이 없을 때, DoesNotExist 에러가 발생한다.
이러한 문제를 막기 위해, 장고에서는 Page not found의 기능을 제공해준다.
사용하는 방법은 간단하다.
우선 view.py에 get_object_or_404를 import 해준다.
#blog/views.py
from django.shortcuts import render, get_object_or_404
다음으로 view파일 내의 post_show 부분에 Post를 얻어오는 방식을 수정해준다.
#기존
def post_show(request,pk):
post = Post.objects.get(pk=pk)
return render(request, 'blog/post_show.html',{'post' :post})
#수정
def post_show(request,pk):
post = get_object_or_404(Post,pk=pk) #Post에 pk가 없으면 404 get
return render(request, 'blog/post_show.html',{'post' :post})
#결과
이 404 page는 수정이 가능합니다. 나중에 posting gogo
정말 기본만 한 기분, 이제 create와 update까지만들면 기본적인 blog는 완성할 수 있겠다.
LIST
'Web > django' 카테고리의 다른 글
(Django) 사진 적용 (0) | 2020.08.17 |
---|---|
(Django) Filter (0) | 2020.08.16 |
(Django) first project8 - template 확장 (0) | 2020.08.14 |
(Django) first project7 - Bootstrap 적용 및 정적파일 (0) | 2020.08.13 |
(Django) first project6 - Model , view, template 데이터 전달 (0) | 2020.08.13 |