[점프투장고] 3-16 추가기능 - 카테고리 추가

base_view.py

def index(request, category_name='qna'):
    '''
    pybo 목록 출력
    '''
    # logger.info("질문 목록 출력")

    # 입력 파라미터
    page = request.GET.get('page', '1')  # 페이지
    kw = request.GET.get('kw', '')  # 검색어
    so = request.GET.get('so', 'recent')  # 정렬기준

    category_list = Category.objects.all()
    category = get_object_or_404(Category, name=category_name)
    question_list = Question.objects.filter(category=category)

    # 정렬
    if so == 'recommend':
        # aggretation, annotation에는 relationship에 대한 역방향 참조도 가능 (ex. Count('voter'))
        question_list = question_list.annotate(num_voter=Count('voter')).order_by('-num_voter', '-create_date')
    elif so == 'popular':
        question_list = question_list.annotate(num_answer=Count('answer')).order_by('-num_answer', '-create_date')
    else:
        question_list = question_list.order_by('-create_date')

    # 검색
    if kw:
        question_list = question_list.filter(
            Q(subject__icontains=kw) |  # 질문 제목검색
            Q(content__icontains=kw) |  # 질문 내용검색
            Q(answer__content__icontains=kw) |  # 답변 내용검색
            Q(author__username__icontains=kw) |  # 질문 작성자검색
            Q(answer__author__username__icontains=kw)  # 답변 작성자검색
        ).distinct()

    # 페이징처리
    paginator = Paginator(question_list, 10)  # 페이지당 10개식 보여주기
    page_obj = paginator.get_page(page)
    max_index = len(paginator.page_range)

    context = {'question_list': page_obj, 'max_index': max_index, 'page': page, 'kw': kw, 'so': so,
               'category_list': category_list, 'category': category}
    return render(request, 'pybo/question_list.html', context)

question_list.html

<!-- Sidebar  -->
<nav id="sidebar" class="border-top border-secondary">
    <div class="list-group">
        {% for cat in category_list %}
            {% if cat == category %}
                <a class="rounded-0 list-group-item list-group-item-action list-group-item-light active"
                   href="{{ cat.get_absolute_url }}">{{ cat.description }}</a>
            {% else %}
                <a class="rounded-0 list-group-item list-group-item-action list-group-item-light"
                   href="{{ cat.get_absolute_url }}">{{ cat.description }}</a>
            {% endif %}
        {% endfor %}
    </div>
</nav>

현재 위 코드로 카테고리 기능을 완성했습니다. 템플릿은 실제 pybo 사이트의 소스를 참고했습니다.
저는 모든 카테고리 목록을 템플릿에 넘겨준 뒤에 for문으로 순회하면서 출력했습니다.

다른 답변에 저자분께서 달아주신 답변의 view 코드을 보면 모든 카테고리 queryset(제 코드에서 category_list)는 context에 포함시키지 않고, 현재 질문의 카테고리만 넘겨주는 것으로 보입니다. 그렇다면 카테고리 전체 목록에는 어떠한 방식으로 접근하는 건가요?

제 추측은 아래와 같습니다.
1. 모든 카테고리 목록을 일일이 html파일에 적는다.
2. 템플릿에서 모델에 접근하여 Category 모델의 모든 인스턴스를 가져온다.

(질문 이해에 도움이 될까 싶어 추측을 함께 적었습니다.)

점프투장고 덕에 장고 입문을 하게 되었습니다.
좋은 책 써주셔서 감사힙니다.

qaws1000 190

M 2022년 1월 19일 9:47 오후

목록으로
1개의 답변이 있습니다. 1 / 1 Page

https://pybo.kr/pybo/question/detail/230/

위 답변에 이미 sidebar.html이 나와있네요. 궁금증을 해결했습니다.

qaws1000

M 2022년 1월 19일 10:15 오후