1. CBV로 포스트 목록 페이지 만들기
여러 Posts 를 나열하기 위해서는 ListView 클래스를 사용해야 한다. 그러기 위해서는 blog/views.py 의 모든 내용을 수정해야한다.
from django.shortcuts import render
from django.views.generic import ListView
from .models import Post
# 전에 포스트 페이지를 위해 만들었던 FBV 스타일의 index() 함수를 대체하는 PostList 클래스를 ListView 클래스를 상속해서 만든다.
# 이 코드의 뜻은 ListView 를 사용하는데 model 은 Post 라는 뜻이다.
class postList(ListView):
model = Post
그 다음은 만약 주소창에 '/blog/' 로 끝나는 url 이 입력되었을 경우를 대비해 blog/urls.py 를 만약 url 이 '/blog/' 로 끝날 때 PostList 클래스로 처리하도록 수정해준다.
from django.urls import path
from . import views # 현재 디렉토리에 있는 views.py 를 가져오라는 의미
urlpatterns = [
path('', views.PostList.as_view()),
path('<int:pk>/', views.single_post_page), # 만약 /blog/ 뒤에 정수 형태의 값이 붙는 url 이라면 blog/views.py 의 single_post_page() 함수에 정의된 대로 처리함
]
이후 'http://127.0.0.1:8000/blog' 에 접속해 보면
이와 같은 에러가 난다. 내용을 보니 뭐 template 이 없으니까 blog/post_list.html 이 필요하단 말 같다.
참고로 장고는 모델 명 뒤에 '_list' 가 붙는 html 형태를 기본으로 필요로 한다고 한다. 여기서는 Post 모델을 사용하기 때문에 post_list.html 이 필요한 것이다.
이 문제를 해결하는 방법은 두가지가 있다.
(1) PostList 클래스에서 template_name 을 직접 지정
(2) blog/post_list.html 을 직접 생성
둘 다 해보자꾸나 형석아
(1) PostList 클래스에서 template_name 을 직접 지정
blog/views.py 의 PostList 클래스에 이미 만들어놓은 index.html 을 사용하기 위해 template_name = 'blog/index.html' 을 추가한다.
from django.shortcuts import render
from django.views.generic import ListView
from .models import Post
# 전에 포스트 페이지를 위해 만들었던 FBV 스타일의 index() 함수를 대체하는 PostList 클래스를 ListView 클래스를 상속해서 만든다.
# 이 코드의 뜻은 ListView 를 사용하는데 model 은 Post 라는 뜻이다.
class PostList(ListView):
model = Post
template_name = 'blog/index.html'
이제 다시 웹 페이지로 돌아와 새로고침 갈겨준다.
이상 무.
아니 근데 먼저 작성해 놓은 Post 내용들이 보이지 않는다. 이상 유..
해결방법은 앞에서 FBV 를 사용할 때는 index() 함수에서 Post.object.all() 함수로 Post 레코드를 posts 딕셔너리로 이름을 지어서 blog/templates/blog/index.html 에서 for 문으로 posts 딕셔너리들을 나열했다.
하지만 ListView 로 만든 모델을 템플릿으로 가져오려면 'object_list' 를 사용하면 된다.
자자 우리는 '/blog/' 라고 url 을 입력했을 때 포스트 목록을 나열할라카니까 blog/templates/blog/index.html 을 수정해야겠지??
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Blog</title>
</head>
<body>
<h1>Blog</h1>
{% for p in 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>
그리고 새로고침.
진짜 이상 무.
(2) blog/post_list.html 을 직접 생성
이번엔 blog/post_list.html 을 직접 생성하는거니까 (1) 에서 처음에 한 blog/views.py 에서 template_name = 'blog/index.html' 을 지우자!
그리고 blog/templates/blog/index.html 파일 명을 post_list.html 로 바꾸면 끝.
또 하나! 포스트 목록을 작성 일자 순으로 나열할라면 blog/views.py 에 ordering = '-pk' 만 추가해주면 된다.
from django.shortcuts import render
from django.views.generic import ListView
from .models import Post
# 전에 포스트 페이지를 위해 만들었던 FBV 스타일의 index() 함수를 대체하는 PostList 클래스를 ListView 클래스를 상속해서 만든다.
# 이 코드의 뜻은 ListView 를 사용하는데 model 은 Post 라는 뜻이다.
class PostList(ListView):
model = Post
ordering = '-pk' # 포스트를 순서대로 나열
2. CBV로 포스트 상세 페이지 만들기
이젠 각각의 포스트를 보여주는 상세 페이지를 만듭시다.
위에서는 포스트를 목록 형태로 보여주기 위해 ListView 를 사용했는데, 하나의 포스트를 자세하게 보여주기 위해선 DetailView 를 사용한다.
그러기 위해선 blog/views.py 를 수정하자. 여기서 CBV로 상세 페이지 만들꺼니까 아래의 sinfgle_post_page는 필요 없어진다. 그러면 자연스럽게 render() 함수도 필요없으니까 import 에서 지워준다.
from django.views.generic import ListView, DetailView
from .models import Post
# 전에 포스트 페이지를 위해 만들었던 FBV 스타일의 index() 함수를 대체하는 PostList 클래스를 ListView 클래스를 상속해서 만든다.
# 이 코드의 뜻은 ListView 를 사용하는데 model 은 Post 라는 뜻이다.
class PostList(ListView):
model = Post
ordering = '-pk' # 포스트를 순서대로 나열
class PostDetail(DetailView):
model = Post
이젠 만약에 주소창에 'blog/{id}' 형태의 url 가 입력되었을 경우를 대비해 blog/urls.py 도 수정하자.
from django.urls import path
from . import views # 현재 디렉토리에 있는 views.py 를 가져오라는 의미
urlpatterns = [
path('<int:pk>/', views.PostDetail.as_view()),
path('', views.PostList.as_view()),
]
이제 주소창에 'http://127.0.0.1:8000/blog/1' 을 입력 시,
또 뭐가 없댄다.
보니까 뭐 post_datail.html 이 없어서 그런 것 같다.. ListView 써서 포스트 목록 나열할 때는 post_list.html 이었는데, 이번에는 detail 인거 보니까 DetailView는 '모델명_detail.html' 인듯..
이번에는 그냥 blog/templates/blog/single_post_page.html 을 post_detail.html 로 바꾸자..
그리고 새로고침하면,
이상 무
'캡스톤 > Django' 카테고리의 다른 글
[Django] 포스트 상세 페이지에 부트스트랩 적용 (0) | 2022.03.18 |
---|---|
[Django] 포스트 목록 페이지에 부트스트랩 적용 (0) | 2022.03.18 |
[Django] URL 설정 (0) | 2022.03.11 |
[Django] 모델 생성 (0) | 2022.03.10 |
[Django] 블로그 앱, 페이지 앱 만들기 (0) | 2022.03.10 |