[Django] CBV로 페이지 만들기

2022. 3. 11. 20:58·캡스톤/Django

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
'캡스톤/Django' 카테고리의 다른 글
  • [Django] 포스트 상세 페이지에 부트스트랩 적용
  • [Django] 포스트 목록 페이지에 부트스트랩 적용
  • [Django] URL 설정
  • [Django] 모델 생성
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[Django] CBV로 페이지 만들기
상단으로

티스토리툴바