[REAL Python – Django] – “Django – post 리스트 페이지, 상세 페이지(CBV)”
[REAL Python – Django] – “Django – post 리스트 페이지, 상세 페이지(CBV)”
2월 11, 2022
Django의 ListView()
클래스로 리스트 페이지 만들기
from django.shortcuts import render
from django.views.generic import ListView
from .models import Post
class PostList(ListView):
model = Post # model을 정해 줌.
위의 코드를 추가했습니다. 클래스를 기반으로 페이지를 만드는 것입니다. PostList
클래스는 ListView
클래스를 상속한 것임을 이제는 알 수 있겠죠?
urlpatterns = [
path('', views.PostList.as_view()),
# path('', views.index), # blog/ 면 views의 index() 함수를 수행
path('<int:pk>/', views.single_post_page),
]
url 패턴 부분도 수정해주겠습니다. 2줄에 보면, /blog/로 끝난다면 views.PostList.as_view()
가 처리하게끔 되어 있네요.
장고의 ListView 클래스는 모델 이름 뒤에 _list
가 붙은 파일을 템플릿으로 사용하게끔 되어 있습니다. 예전에 만들어 두었던 index.html
을 post_list.html
로 이름을 바꾸어 주겠습니다.
ListView
에서 만들어진 모델을 템플릿에서 가져오려면 object_list
를 사용하면 됩니다. for문 부분을 바꾸어 주면 되겠죠.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Blog</title>
</head>
<body>
<h1>Blog</h1>
{% for p in object_list %} <!-- post_list 도 인식함. !-->
<hr/>
<h2><a href="{{ p.get_absolute_url }}">{{ p.title }}</a></h2>
<h4>{{ p.created_at }}</h4>
<p>{{ p.content }}</p>
{% endfor %}
</body>
</html>
Django의 ListView()
클래스로 상세 페이지 만들기
위와 비슷한 방법으로 상세 페이지를 만들 수 있었습니다.
class PostDetail(DetailView):
model = Post
위의 코드를 views.py
에 추가해 주었습니다.
urlpatterns = [
path('', views.PostList.as_view()),
path('<int:pk>/', views.PostDetail.as_view())
]
위에서와 마찬가지로 클래스를 이용하도록 코드를 작성해 주었습니다. 템플릿 이름은 모델명_detail.html
을 찾게 되므로 이름도 수정해 주었습니다.