이전포스트
[Django] 1. 개발 환경 설정 https://wroni.tistory.com/4
[Django] 2 - 1. URL과 View https://wroni.tistory.com/5
[Django] 2 - 2. 모델 https://wroni.tistory.com/6
[Django] 2 - 3. 장고 관리자 https://wroni.tistory.com/7
[Django] 2 - 4. 조회와 템플릿 https://wroni.tistory.com/8
[Django] 2 - 5. URL과 네임스페이스, 2 - 6. 데이터 저장 https://wroni.tistory.com/9
[Django] 2 - 7. 스태틱 https://wroni.tistory.com/10
[Django] 2 - 8. 부트스트랩 https://wroni.tistory.com/11
[Django] 2 - 9. 템플릿 상속 https://wroni.tistory.com/12
[Django] 2 - 10. 폼 https://wroni.tistory.com/13
[Django] 3 - 1. 네비게이션바 https://wroni.tistory.com/14
[Django] 3 - 2. 페이징 https://wroni.tistory.com/15
3 - 3. 템플릿 필터
템플릿 필터는 템플릿 태그에서 | 문자 뒤에 사용하는 필터를 의미한다. 다음 예처럼 default_if_none 과 같은 것들이 템플릿 필터이다.
{{ form.subject.value|default_if_none:'' }}
1. 게시물 번호 오류
페이징 목차까지 만들어 놓은 파이보 페이지에서, 질문 목록 화면을 보면 게시물 번호가 항상 1부터 시작된다.
이것은 두번째 페이지에 가도 똑같다.
2. 게시물 번호
만약 게시물 전체 개수가 12개라면, 첫번째 페이지는 12~3까지 역순을 보여지고, 두번째 페이지는 2~1까지 보이게 하고싶다.
이렇게 페이지별로 게시물의 번호를 역순으로 정렬하기 위해서는 아래와 같은 공식을 사용하면 된다.
번호 = 전체건수 - 시작인덱스 - 현재인덱스 + 1
시작 인덱스는 페이지당 시작되는 게시물의 시작 번호이다. 페이지당 게시물을 10건씩 보여준다면, 1 페이지의 시작 인덱스는 1, 2 페이지의 시작 인덱스는 11이 된다. 현재 인덱스는 페이지에 보여지는 게시물 개수만큼 0부터 1씩 증가되는 번호이다.
따라서 전체 게시물 개수가 12개이며, 페이지당 10건씩 게시물을 보여준다면 12 - 1 - (0~9 반복) + 1 이 된다.
12~3까지 표시되고 2페이지의 경우, 12 - 11 - (0~1 반복) + 1 이 되어 2~1 이 표시된다.
템플릿에서 이 공식을 사용하려면 빼기 기능이 필요한데, 앞에서 더하기 필터 |add:5 를 사용한 것과 같이 빼기 필터 |sub:3 이 있으면 좋을 듯 하다. 장고에는 빼기 필터가 없기 때문에 빼기 필터를 직접 만들 것이다.
|add:-3 과 같이 숫자를 직접 입력하면 더하기 필터를 이용하여 원하는 값을 뺀 결과를 화면에 보여주 수 는 있다. 하지만 이 방법은 이곳에는 사용할 수 없다. 왜냐하면 add 필터에는 변수를 적용할 수 없기 때문.
3. 템플릿 필터 작성
템플릿 필터 작성 전, 템플릿 필터 파일을 저장할 templatetags 디렉터리가 필요하다.
이제 templatetags 디텔터리를 생성하였으니, 해당 디렉터리에 pybo.filter.py 파일을 작성할 것이다.
파일 : C:\projcets\mysite\templatetags/pybo_filter.py
from django import template
register = template.Library()
@register.filter
def sub(value, arg):
return value - arg
위처럼 sub 함수에 @register.filter 애너테이션을 적용하면 템플릿에서 해당 함수를 필터로 사용할 수 있게 된다.
sub 필터는 기존 값 value에서 입력으로 받은 값 arg를 빼서 리턴한다.
4. 템플릿 필터 사용
작성한 sub 필터를 템플릿에서 사용해보자.
sub 필터를 사용하기 위해서는 템플릿 상단에 {% load pybo_filter %}로 sub 필터를 저장한 파일(pybo_filter.py)을 먼저 로드해야 한다.
템플릿 상단에 extends가 있을 경우, load 문은 extends 문 다음에 위치해야 한다.
파일 : C:\projects\mysite\templates/pybo/question_list.html
{% extends 'base.html' %}
{% load pybo_filter %}
...생략...
<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>
{% load pybo_filter %} 문을 상단에 적어두고 번호 부분을 위처럼 바꾸어 주었다.
번호 = 전체건수 - 시작인덱스 - 현재인덱스 + 1 이 적용되었다.
공식 | 코드 |
전체건수 | question_list.paginator.count |
시작인덱스 | question_list.start_index |
현재인덱스 | forloop.counter0 |
수정 후에 웹 서버를 구동시키면 항상 1부터 시작하지 않고 원하는대로 동작하는 것을 알 수 있다.
두번째 페이지도 원하는대로 동작하고 있다.
3 - 4. 답변 개수 표시
이제 질문 목록에 '해당 질문에 달린 답변 개수'를 표시할 수 있도록 할 것이다.
답변 개수는 다음처럼 게시물 제목 바로 오른쪽에 표기하자.
파일 : C:\projects\mysite\templates\pybo\question_list.html
(... 생략 ...)
<td>
<a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a>
{% if question.answer_set.count > 0 %}
<span class="text-danger small ml-2">{{ question.answer_set.count }}</span>
{% endif %}
</td>
<...>
{% if question.answer_set.count > 0 %} 는 답변이 있는 경우를 검사하는 것이다.
{{ question.answer_set.count }} 로 답변 개수를 표시한다. 이제 답변이 있는 질문은 제목 오른쪽에 빨간색 숫자로 표시된다.
※ 본 내용은 django 공부 기록이며, 점프 투 장고를 참고하였습니다.
https://wikidocs.net/book/4223
점프 투 장고
**점프 투 장고 오프라인 책 출간 !! (2020.12)** * [책 구입 안내](https://wikidocs.net/105844)
wikidocs.net
'Django > Django 기초' 카테고리의 다른 글
[Django] 3 - 6. 계정생성 (0) | 2021.12.07 |
---|---|
[Django] 3 - 5. 로그인과 로그아웃 (0) | 2021.12.06 |
[Django] 3 - 2. 페이징 (0) | 2021.12.02 |
[Django] 3 - 1. 네비게이션바 (0) | 2021.12.02 |
[Django] 2 - 10. 폼 (0) | 2021.12.01 |