Python, Django
[Django]장고 path-converter, get object or 404 장고로 게시물 상세페이지 만들기
에는
2019. 11. 28. 17:47
Overview
- get object or 404
- path-converter
- post의 detail page 만들기
path-converter
-
path-converter : <type:name>과 같은 모양으로 작성
-
지정한 타입의 name 변수를 view 함수로 넘기는 역할을 합니다.
from django.contrib import admin
from django.urls import path
import picker.views
import post.views
urlpatterns = [
path('admin/', admin.site.urls),
path('', picker.views.pick, name='pick'),
path('list/', post.views.postlist, name='postlist'),
path('show/<int:post_id>', post.views.show, name='show'),
]
위의 <int:post_id>가 path-converter에 해당합니다.
path converter
- 여러 객체들을 다루는 계층적인 url을 자동으로 쉽고 편하게 생성 가능
- 몇 번째 post 객체를 호출하는지에 따라 url을 달리 하는 것
- type을 지정하지 않으면 기본적으로 str으로 인식
get_object_or_404
view 설정
from django.shortcuts import render, get_object_or_404
from .models import Post
# Create your views here.
def postlist(request):
posts = Post.objects.all()
return render(request, 'postlist.html', {'posts': posts})
def show(request, post_id):
post = get_object_or_404(Post, pk=post_id)
return render(request, 'show.html', {'post': post})
- show 함수를 실행할 때, path-converter를 인자로 받는다.
- post 변수는 Post DB에서 pk가 post_id에 해당하는 객체를 가져온다.
- 해당하는 객체가 없을 경우 404 에러를 띄운다.
templates 설정
<a href="{% url 'postlist' %}">목록으로 이동</a>
<h1>제목: {{post.title}}</h1>
{{post.created_at}}<br/>
{{post.content|linebreaks}}
- a 태그의 href 속성값은 템플릿 태그로 적어줍니다. {% url 'pathname' %}과 같은 형식으로 적습니다.
- linebreaks는 템플릿 변수 필터입니다. 엔터를 반영해서 보여줍니다.
서버를 돌리고, 도메인 뒤에 show/1을 붙이면 첫 번째 게시물의 제목, 내용이 뜹니다.

postlist.html도 수정해보겠습니다.
<h1>등록된 글</h1>
{% for post in posts %}
<a href="{% url 'show' post.id %}">{{ post.title }}</a>
<br/>
{% endfor %}
- 'show' path로 이동하되, path-converter에 post의 id값을 전달
서버 run한 모습
