Q&A

책을 따라하다가 막히는 부분이 있나요?
질문을 남겨주세요.

[독자 질문] 카테고리 페이지에 pagenated_by 를 어떻게 적용하나요?

3 years, 6 months ago

sungyong sungyong

며칠전 저희에게 아래와 같은 질문이 들어왔습니다. 

다른 분들에게도 도움이 될 것 같아, Q&A 게시판에 공개를 하고자 합니다. 

아래는 질문 내용입니다 .




다름이 아니오라 가족들 사진을 많이 올리다보니

카테고리 페이지가 너무 길어지는 경향이 있어 일반 포스트 리스트 페이지와 같이 Paganated_by를 적용하고 싶은데

category_page  클래스형이 아닌 함수형으로 되어 있어 적용이 안돼네요...


Pagenation을 임포트해서 하라는 포스트 들이 많던데... 적용을 해봐도 영... 잘 안되네요...


혹시 이부분과 관련하여 조언을 부탁드려도 괜찮을까요?



sungyong
sungyong   3 years, 6 months ago

안녕하세요. category_page 역시 CBV로 바꿔주면 post_list.html을 건드리지 않고도 바꿀 수 있습니다. 

먼저, views.py에 PostList 클래스를 상속받은 PostListByCategory 클래스를 만듭니다. 

그리고 기존의 category_page는 주석처리 하시고요. 


class PostListByCategory(PostList):
def get_queryset(self):
slug = self.kwargs['slug']
if slug == 'no_category':
category = None
else:
category = Category.objects.get(slug=slug)
return Post.objects.filter(category=category).order_by('-pk')

def get_context_data(self, **kwargs):
context = super(PostListByCategory, self).get_context_data()

slug = self.kwargs['slug']
if slug == 'no_category':
category = '미분류'
else:
category = Category.objects.get(slug=slug)
context['category'] = category
return context


# def category_page(request, slug):
# if slug == 'no_category':
# category = '미분류'
# post_list = Post.objects.filter(category=None)
# else:
# category = Category.objects.get(slug=slug)
# post_list = Post.objects.filter(category=category)
#
# return render(
# request,
# 'blog/post_list.html',
# {
# 'post_list': post_list,
# 'categories': Category.objects.all(),
# 'no_category_post_count': Post.objects.filter(category=None).count(),
# 'category': category,
# }
# )

PostList의 모든 기능은 그대로 가져오면서, get_queryset 함수를 오버라이딩하여 해당 category의 Post들만 불러오도록 했습니다. 특히, order_by 함수를 이용해서 pk 역순으로 보여주도록 했습니다. 

그리고, get_context_data 함수도 오버라이딩 해서, category page가 추가적으로 제공해야 하는 'category'를 처리합니다. 이 부분이 있어야 post_list.html 상단에 아래와 같이 회색 버튼 모양으로 카테고리 명을 표시할 수 있습니다. 만약, 이 부분이 불필요하시다면, get_context_data함수는 스킵하셔도 됩니다. 



category_page는 주석처리 해버렸으니, urls.py에서도 수정을 해줘야 하죠. 아래와 같이 수정해주세요. 

from django.urls import path
from . import views

urlpatterns = [
path('search/<str:q>/', views.PostSearch.as_view()),
path('delete_comment/<int:pk>/', views.delete_comment),
path('update_comment/<int:pk>/', views.CommentUpdate.as_view()),
path('update_post/<int:pk>/', views.PostUpdate.as_view()),
path('create_post/', views.PostCreate.as_view()),
path('tag/<str:slug>/', views.tag_page),
path('category/<str:slug>/', views.PostListByCategory.as_view()),
# path('category/<str:slug>/', views.category_page),
path('<int:pk>/new_comment/', views.new_comment),
path('<int:pk>/', views.PostDetail.as_view()),
path('', views.PostList.as_view()),
# path('<int:pk>/', views.single_post_page),
# path('', views.index),
]


이제 페이지에 접속해보시면, 잘 될겁니다. 

Updated: April 15, 2021, 7:22 p.m.

play
play   3 years, 6 months ago

저자님 너무 감사합니다~~ 잘 작동합니다~~ 항상 건강하십시오~~~ ^^

Updated: April 15, 2021, 9 p.m.

Leave a Comment:
목록보기
Search
  • 자유게시판
  • Q&A