카테고리 페이지 만들기
Posted on 2021-08-25 by GKSRUDTN99
Django로 웹사이트 만들기
장고
테스트 코드 작성하기
새롭게 test_category_page()
함수를 작성한다.
# blog/tests.py
def test_category_page(self):
response = self.client.get(self.category_programming.get_absolute_url())
self.assertEqual(response.status_code,200)
soup = BeautifulSoup(response.content, 'html.parser')
self.navbar_test(soup)
self.category_card_test(soup)
self.assertIn(self.category_programming.name, soup.h1.text)
main_area = soup.find('div', id = 'main-area')
self.assertIn(self.category_programming.name, main_area.text)
self.assertIn(self.post_001.title, main_area.text)
self.assertNotIn(self.post_002.title, main_area.text)
self.assertNotIn(self.post_003.title, main_area.text)
Category 모델 수정하기
Category 모델에 get_absolute_url()
함수 정의하기
slug
필드를 활용한다.
# blog/models.py
class Category(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=200, unique=True, allow_unicode=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return f'/blog/category/{self.slug}/'
class Meta:
verbose_name_plural = 'Categories'
urls.py 수정하기
# blog/urls.py
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('category/<str:slug>/', views.category_page),
path('<int:pk>/', views.PostDetail.as_view()),
path('', views.PostList.as_view()),
]
views.py 수정하기
FBV 방식으로 구현할 것인데, FBV 방식은 request 인자를 반드시 받아야 한다.
# blog/views.py
def category_page(request, slug):
category = Category.objects.get(slug=slug)
return render(
request,
'blog/post_list.html',
{
'post_list': Post.objects.filter(category=category),
'categories': Category.objects.all(),
'no_category_post_count': Post.objects.filter(category=None).count(),
'category': category
}
)
post_list.html 수정하기
category
를 넘겨받았다면, <h1>
태그 안에 카테고리 뱃지가 뜨도록 한다.
<!-- blog/templates/blog/post_list.html-->
<h1>Blog {% if category %}<span class="badge bg-secondary float-end">{{ category }}</span>{% endif %}</h1>
미분류 카테고리 처리하기
views.py에서 slug로 no_category가 넘어오는 경우를 if문으로 처리해준다.
# blog/views.py
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
}
)