지난 주에 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 이런 식으로 사용하면 된다. )

'TIL > Python | Django' 카테고리의 다른 글
2021.7.16 TIL : [Python] 기초 문법8 - 클래스 상속 (0) | 2021.07.17 |
---|---|
2021.6.28 TIL : [Django] REST API & Rest framework (0) | 2021.06.28 |
2021.5.24 TIL : [Django] 블로그 만들기(1) - 파이썬으로 DB 생성, superuser 만들기 (0) | 2021.05.24 |
2021.5.16 TIL : [Python] 기초 문법7 - 파일 사용하기 (0) | 2021.05.16 |
2021.5.8 TIL : [Python] 기초 문법6 - 세트 (0) | 2021.05.08 |
댓글