오늘 Django 사용법을 익히던 중 눈에 익던 템플릿 태그들과는 다르게 조금은 어색했던 태그 몇 개를 정리하려 한다.
여태까지는 분기문과 반복문만 사용했었지만 이번에 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 %}
처럼 띄어쓰기를 기준으로 작성하면 된다.
우선 이 글을 정리하는 이유는 페이징 처리를 진행하면서 처음, 끝으로 이동하는 버튼을 만들다가 끝으로 이동하는 버튼을 동작하게 하기 위해서 ?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