하루에는

[Django]장고 path-converter, get object or 404 장고로 게시물 상세페이지 만들기 본문

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한 모습

Comments