관리 메뉴

웹개발자의 기지개

[Django] Template Filter 만들기 - Custom Template Filter 본문

python/Django

[Django] Template Filter 만들기 - Custom Template Filter

http://portfolio.wonpaper.net 2023. 5. 21. 19:34

사용자정의 형식의 내가 원하는 Template Filter 를 만들어보자.

 

필자는 우선적으로 게시판 목록의 글번호값을 구할때 이부분을 이용해 보았다.

 

[ filter.py ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django import template
 
register = template.Library()
 
 
@register.filter(name="decrease")
def decrease(value):
    value = value - 1
    return value
 
 
@register.filter(name="substract")
def substract(value, arg):
    return value - arg
cs

 

[ /board/views.py ]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
 
def index(request):
 
    context = {}
    board_lists = Board.objects.all().order_by('-b_no')
    cnt = board_lists.count()
 
    page = request.GET.get('page')
    paginator = Paginator(board_lists, 2)
 
    try:
        page_obj = paginator.page(page)
    except PageNotAnInteger:                # page 값이 아예 없을때
        page = 1
        page_obj = paginator.page(page)
    except EmptyPage:                       # page 값은 있는데, 존재하지 않는 page 값일때
        page = paginator.num_pages
        page_obj = paginator.page(page)
 
 
    context['board_lists'= board_lists
    context['page_obj'= page_obj
    context['paginator'= paginator
    return render(request, 'board/index.html', context)
cs

 

[ /templates/board/index.html ] - 게시판 목록 Template 페이지

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{% load filter %}
 
    <table border="1" cellpadding="0" cellspacing="0" width="80%">
{% if board_lists.exists %}
{% for i in page_obj %}
    <tr style="border-top:solid 1px #dddddd;">
        <td width="8%" align="center">
            <!-- 글번호 = 전체글수 - 시작인덱스 - 현재인덱스 + 1 -->
            <!--int num = ViewBag.TotalRecord - 10 * (page1 - 1);-->
            {{page_obj.paginator.count|substract:page_obj.start_index|substract:forloop.counter0|add:1}}
            </td>
        <td width="42%" align="left"><a href="/board/board_detail/{{ i.b_no }}/">{{ i.b_title }}</a></td>
        <td width="10%" align="center">{{ i.b_writer }}</td>
        <td width="20%" align="center">{{ i.b_reg_date|date:"Y-m-d" }}</td>
        <td width="8%" align="center">{{ i.b_count|intcomma }}</td>
        <td width="12%" align="right" style="padding:5px 0;">
            <a href="/board/board_mod/{{ i.b_no }}/" class="btn btn-outline-success">수정</a>
            <a href="javascript:boardDel({{ i.b_no }})" class="btn btn-outline-success">삭제</a>
        </td>
    </tr>
{% endfor %}
{% else %}
     <tr>
         <td colspan="6" style="text-align: center;">등록된 글이 없습니다.</td>
     </tr>
{% endif %}
    </table>
cs

 

위의 소스중에 10라인이 그 부분이다. substract 필터를 사용하는 부분이다.

{{page_obj.paginator.count|substract:page_obj.start_index|substract:forloop.counter0|add:1}}

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

 

 

참고 : https://docs.djangoproject.com/ko/4.0/howto/custom-template-tags/

참고 : https://yjshin.tistory.com/entry/Python-django-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EA%B2%8C%EC%8B%9C%EA%B8%80-%EB%B2%88%ED%98%B8-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0-%ED%85%9C%ED%94%8C%EB%A6%BF-%ED%95%84%ED%84%B0

참고 : https://devlink.tistory.com/305

참고 : https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

참고 : https://youngwonhan-family.tistory.com/entry/123

 

 

 

 

Comments