[TIL | 240111] Django - 템플릿 필터(filter) + 답변 개수 표시

sun_U·2024년 1월 11일
0

TIL

목록 보기
16/21
post-thumbnail

템플릿 필터 (Template filter)


  • 템플릿 태그에서 | 문자 뒤에 사용하는 필터

1. 게시물 번호 오류

  • 현재 사이트는 어떤 페이지를 들어가도 게시물 번호가 1부터 시작되는 문제 발생

2. 게시물 번호

  • 페이지별로 게시물의 번호를 역순으로 정렬하기 위한 공식 번호 = 전체건수 - 시작인덱스 - 현재인덱스 + 1
  • django에는 빼기 필터가 없으므로 직접 만들어야 함.
    • |add:-3 과 같은 경우 add 필터는 인수로 숫자만 받을 수 있어 변수 적용이 안됨.

3. 템플릿 필터 작성하기

1) pybo/templatetags directory 생성 (반드시 templatetags 디렉터리는 앱 디렉터리 하위에 생성)

2) pybo/templatetags/pybo_fileter.py

from django import template

register = template.Library()

@register.filter
def sub(value, arg):
    return value - arg 
  • @register.filter 에너테이션을 적용해 템플릿에서 해당 함수를 필터로 사용

4. 템플릿 필터 사용하기

1) 템플릿 상단에 필터 파일 로드

템플릿 상단에 extends문이 있으면 load문은 extends문 아래에 위치

2) question_list.html 수정

{% extends 'base.html' %}
{% load pybo_filter %}
{% block content %}
<div class="container my-3">
    <table class="table">
        <thead>
        <tr class="table-dark">
            <th>번호</th>
            <th>제목</th>
            <th>작성일시</th>
        </tr>
        </thead>
        <tbody>
        {% if question_list %}
        {% for question in question_list %}
        <tr>
            <td>
                <!-- 번호 = 전체건수 - 시작인덱스 - 현재인덱스 + 1 -->
                {{ question_list.paginator.count|sub:question_list.start_index|sub:forloop.counter0|add:1 }}
            </td>
            <td>
                <a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a>
            </td>
            <td>{{ question.create_date }}</td>
        </tr>
(... 생략 ...)
공식코드
전체건수question_list.paginator.count
시작인덱스question_list.start_index
현재인덱스forloop.counter0

[ 결과 ]

답변 개수 표시


+ 답변 개수 표시

  • 질문 목록에 해당 질문에 달린 답변 개수 표시

question.html 수정

(... 생략 ...)
<td>
    <a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a>
    {% if question.answer_set.count > 0 %}
    <span class="text-danger small mx-2">{{ question.answer_set.count }}</span>
    {% endif %}
</td>
<...>

profile
Data Engineer AI/ Metaverse :)

0개의 댓글