본문 바로가기
TIL/Python | Django

2021.5.24 TIL : [Django] 블로그 만들기(2) - path-converter로 각 블로그의 디테일 페이지 만들기

by yeon_zoo 2021. 5. 29.

지난 주에 Django를 이용해서 블로그 DB를 만들고 해당 정보를 한 페이지에 보여주는 것까지 완료 했다. 만약 블로그를 클릭하여 상세 정보까지 보여주는 페이지를 만들고 싶다면, 어떻게 해야 할까? 우리가 배웠던 대로 html 파일을 각 url에 하나씩 만들고, views.py와 urls.py 에 각각 입력하는 방법을 이용하게 되면 블로그를 하나씩 올릴 때마다 새로 views 와 urls를 모두 업데이트 해야 한다. 따라서 이렇게 하기 보다 path-converter을 이용하여 하나의 파일로 다양한 블로그 글의 디테일 페이지를 보여줘야 한다. Path-converter를 이용해서 id 값만 다르게 적어주면 다르게 보여줄 수 있고, 이를 views.py에 있는 매개변수로 넘겨줄 수 있다.

 

Path-converter를 사용하는 방법은 바로 코드를 해보면서 익힐 수 있다. 먼저 다음과 같은 코드를 views.py에 추가한다. 

def detail(request, id):
		blog = Blog.objects.get(id = id)

이전 함수들과는 달리 여기서는 id를 매개변수로 받는다. 이는 get을 통해 id 값을 갖는 객체를 하나 불러오라는 말이다. 더 간편하게 하기 위해 사용하는 방법도 있다. 

from django.shortcuts import render, get_object_or_404
from .models import Blog

# Create your views here.
def home(request):
    blogs = Blog.objects.all()
    return render(request, 'home.html', {'blogs': blogs})

def detail(request, id):
    blog = get_object_or_404(Blog, pk = id)
    return render(request, 'detail.html', {'blog': blog})

먼저 django.shortcuts 로부터 get_object_or_404라는 메소드를 import해온다. 이 메서드를 이용한 객체를 불러오거나 불러오지 못한 경우 404 : Not Found 페이지를 불러올 수 있다. 여기서 pk는 DB의 primary key를 의미한다. {'blog': blog}의 딕셔너리 형태로 필요한 객체를 불러올 수 있도록 한다. 이 때, id는 어디서 얻어올까?

 

다음과 같은 urls.py 를 먼저 확인해 봐야 한다. 

from django.contrib import admin
from django.urls import path
from blog.views import * # blogs.views에서 선언한 모든 것을 가져옴

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home'),
    path('<str:id>', detail, name='detail'),
]

기본적으로 url을 표시하는 데에 있어서 차이가 있는데, <str:>의 형태를 띈다. 여기서 str 은 문자열 형태를 의미하고 id는 앞서 views.py 내 디테일 함수에서 정한 매개변수의 이름이다. 

 

그럼 id 값은 어디서 얻어오는 걸까? home.html 안을 살펴보자. 현재, blogs 안에 있는 blog 객체들 하나하나가 Object이고, 이를 통해 column에 접근을 할 수 있는데, 각 객체들 별로 서로 다른 id값을 갖고 있다. 이를 확인해보기 위해 {{ blog.id }} 를 넣어보면 된다. (이건 장고에서 DB에 입력 받은 순서대로 하나씩 주는듯) 

 

이런식으로 구성한 후 detail.html 파일에서 blog 객체를 사용하여 작성하면 원하는 대로 각 블로그의 상세 내용 페이지를 제작할 수 있다. (views.py 에서 Blog의 객체를 blog 로 받아왔기 때문에 blog.title 이런 식으로 사용하면 된다. )

블로그의 구조를 한 눈에 보면?

댓글