카테고리 페이지 만들기

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
        }
    )