[Django] 템플릿 태그, 필터

LHW·2023년 5월 22일
0

Django

목록 보기
3/3

오늘 Django 사용법을 익히던 중 눈에 익던 템플릿 태그들과는 다르게 조금은 어색했던 태그 몇 개를 정리하려 한다.

with

여태까지는 분기문과 반복문만 사용했었지만 이번에 with라는 태그를 처음 사용해봤다. 사용법은 아래와 같다.

<!-- {% with question_list.paginator.counter as total %} -->
{% with total=question_list.paginator.counter %}
{% endwith %}

다른 템플릿과 똑같이 태그를 열고, 이후에 닫아줘야 하는것은 동일하다. 사용방법은 주석 안의 작성 방식이나 주석 바깥의 작성방식이나 동일하다.

아래 두 문법 모두 잘 작동한다.
{% with question_list.paginator.counter as total %}
{% with total=question_list.paginator.counter %}

두 개 이상의 변수를 재정의 하려면 {% with total=question_list.paginator.counter per_page=question_list.paginator.per_page %}처럼 띄어쓰기를 기준으로 작성하면 된다.

math filter

우선 이 글을 정리하는 이유는 페이징 처리를 진행하면서 처음, 끝으로 이동하는 버튼을 만들다가 끝으로 이동하는 버튼을 동작하게 하기 위해서 ?page={{ 총 게시글 수/페이지 당 게시글 }}을 작성해야 했는데, 덧셈필터는 별도로 라이브러리를 설치할 필요가 없는 듯 했는데, 더 많은 연산을 활용하려면 라이브러리를 설치해야했다.

pip install django-mathfilters

이후 settings.py파일에 앱을 등록해야한다. 내 프로젝트 파일의 경로는 아래와 같다

[projects/web/config/settings.py]

# Application definition

INSTALLED_APPS = [
    'mathfilters', # 설치한 앱 등록
    ... 
    ...
    ...

그리고 이 필터를 사용하려면 템플릿 파일의 상단에 load해주어야 한다.

{% load mathfilters %}

여러가지 연산을 지원하는데, 나는 나눗셈을 위에서 정리했던 with문과 함께 아래처럼 사용했다.

{% with total=question_list.paginator.count per_page=question_list.paginator.per_page %}
    <li class="page-item">
        <a class="page-link" href="?page={{ question_list.next_page_number }}">다음</a>
    </li>
    <li class="page-item">                  <!-- 나누려는 수|div:나누는수 -->
        <a class="page-link" href="?page={{ total|div:per_page }}">끝으로</a>
    </li>
{% endwith %}

하지만 결과가 total|div:per_page의 결과가 소수점대로 나온다면 올림을 해줘야 하는데 찾아보니까 반올림만 있고 올림은 없나..? 이후에 찾으면 글을 수정해야겠다

그래서 그냥 결국은 필터를 내가 만들어서 사용했다. 만드는 방법도 굉장히 간단하다.

[projects/web/myweb/templatetags/my_filter.py]

from django import template
import math

register = template.Library()

@register.filter
def div(value, arg):
  res = value/arg
  result = math.ceil(res)
  return result

주의해야할 점으로는 내가 생성한 프로젝트 디렉토리의 하위에 templatetags라는 디렉토리가 위치해야 하고, 그 안에 위치한 파일 이름을 템플릿 파일 최상단에 load해주어야 한다. 나는 my_filter.py로 생성했으니 아래처럼 로드해야한다.

{% load my_filter %}

똑같은 div라는 이름으로 필터를 만들었다 보니 혹시 모를 충돌에 대비해 {% load mathfilters %}는 지웠다.

페이징 처리 완료 :D

profile
하루가 다르게 성장하기

0개의 댓글