본문 바로가기

Django/따라하는 장고

17. 템플릿 필터 및 답변 개수 표시

템플릿 필터란 템플릿 태그에서 | 문자 뒤에 사용하는 필터를 말한다. 저번에 사용한 |add:-5, |add:5, |default_if_none 이러한 것들이다. 템플릿 필터를 수정해 커스텀 템플릿 필터를 만들어보자.

 

먼저 저번에 만든 페이지의 문제점을 살펴보자.

게시물의 번호를 보면 1부터 시작하는데 어느 페이지를 가도 게시물 번호가 1번부터 시작한다. 사진의 페이지는 10페이지인데 게시물번호는 1번부터 시작하는것을 볼 수 있다. 

 

만약 게시물 전체 건수가 12개 라면 첫번째 페이지 번호가 12~3 까지 역순으로 보여지고 두번째 페이지에서 2~1까지 보여져야한다. 최근에 작성한 게시물이 맨 앞으로 와야하기 때문에 역순으로 정렬되어야한다. 그렇게 하러면 

번호 = 전체건수 - 시작인덱스 - 현재인덱스 + 1

이러한 공식이 적용되어야 한다. 시작 인덱스는 페이지당 시작되는 게시물의 시작 번호이다. 예를 들어 페이지당 게시물을 10건씩 보여준다면 1페이지의 시작 인덱스는 1, 2페이지의 시작 인덱스는 11이 된다. 현재 인덱스는 페이지에 보여지는 게시물 개수만큼 0부터 1씩 증가되는 번호이다. 따라서 전체 게시물 개수가 12개이고 페이지당 10건씩 게시물을 보여 준다면 공식에 의해 1페이지의 번호는 12 - 1 (0~9 반복) + 1 이 되어 12~3까지 표시되고 2페이지는 12 - 11 - (0~1 반복) + 1 이 되어 2~1 이 표시된다.

템플릿에서 이 공식을 적용하려면 빼기 기능이 필요하다. 앞에서 사용한 더하기 필터 |add:5 처럼 빼기 필터 |sub:3 를 쓰면 될것같지만 빼기필터는 존재하지 않는다. 그래서 빼기 필터를 직접 만들어야 한다.

|add:-3 같이 숫자를 직접입력하여 사용할 수 는 있지만, 지금은 단순한 숫자가 아닌 변수를 적용할 것이기 때문에 저 방법을 사용할 수 없다. add 필터는 인수로 숫자만 가능하기 때문이다.

 

[템플릿 필터 작성]

 

먼저 템플릿 필터 파일을 저장한 templatetags 폴더를 projects\mysite\pybo\templatetags 에 만들자.

디렉토리와 파일을 만드는것은 터미널에서 명령어를 사용하거나 파이참에서 마우스 오른쪽클릭으로 만들거나 편한방식으로 하자.

 

위처럼 sub 함수에 @register.filter 에너테이션을 적용하면 템플릿에서 해당 함수를 필터로 사용할 수 있게 된다. sub 함수는 기존 값 value 에서 입력으로 받은 값 arg 를 빼서 리턴하는 함수이다. 에너테이션은 @ 기호를 붙여 사용하는데 주석이라는 의미를 가지는데 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공하고, 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공하고, 실행시 특정 기능을 실행하도록 정보를 제공한다.

 

작성한 템플릿 필터를 사용하기 위해서는 {% load pybo_filter %} 로 sub 필터를 저장한 파일을 먼저 로드해야한다.

템플릿 상단에 extends 문이 있을경우 load 문은 extends 문 다음에 위치해야한다.

projects\mysite\templates\pybo\question_list.html 파일을 다음과 같이 수정하자.

{% load pybo_filter %} 를 상단에 적어주고 밑에 '번호 = 전체건수-시작인덱스-현재인덱스+1' 에 해당하는 것을 작성했는데 어렵게 생겼지만 단어 하나하나 살펴본다면 간단하다.

question_list.paginator.count 는 전체건수를 의미하고,

question_list.start_index 는 시작인덱스를 의미하고

forloop.counter0 는 현재인덱스를 의미한다.

이것들을 템플릿필터 sub 와 add 를 이용해 작성했다.

결론적으로 보면,

전체건수 - 시작인덱스 - 현재인덱스 + 1 은

question_list.paginator.count|sub:question_list.start_index|sub:forloop.counter0|add:1 과 같은 의미가 된다.

 

이제 서버를 재시작한 후 잘 적용되었는지 확인해보면

잘 적용된것을 확인할 수 있다.

 

[답변 개수 표시]

 

질문 목록에 해당 질문에 달린 답변의 개수를 표시하는 기능을 추가해보자.

projects\mysite\templates\pybo\question_list.html 을 다음과 같이 수정하자.

{% if question.answer_set.count > 0 %} 로 답변이 있는 경우를 검사하고, {{ question.answer_set.count }} 로 답변 개수를 표시했다. 잘 적용되었는지 서버를 시작해서 확인해보자.

 

'Django > 따라하는 장고' 카테고리의 다른 글

19. 회원가입  (0) 2022.11.10
18. 로그인 기능  (0) 2022.11.09
16. Paginator  (0) 2022.11.05
15. 네비게이션 바  (0) 2022.11.04
14. 폼  (1) 2022.11.03