Python/초간단 장고 Django

Django pagenation paginator.num_pages

컴닥 2022. 9. 21. 00:21
반응형

Django의 페이지네이션 기능의

자세한 설명은 다음을 참고하시고.. 

https://wikidocs.net/71240#_2

 

3-02 페이징

* `[완성 소스]` : [github.com/pahkey/jump2django/tree/3-02](https://github.com/pahkey/jump2django/tr ...

wikidocs.net

 

저자께서 마지막에 이런 숙제를 남겨두셨네요. 

지금까지 만든 페이징 기능에 '처음'과 '마지막' 링크를 추가하고 ...

def list_view(request):
    page = request.GET.get('page', '1')
    px_name = request.GET.get('name', '')
    if name == '' or name is None:
        my_list = My.objects.all().order_by('id')
    else:
        my_list = My.objects.filter(Q(name__icontains=name)).distinct().order_by('id')
    paginator = Paginator(my_list, 10)  # 페이지당 10개의 아이템
    page_obj = paginator.get_page(page)  # 현재 페이지 - 출력할 아이템. 
    context = {
        'my_list': page_obj, 
        'max_index': paginator.num_pages, # 마지막 페이지
        'px_name': px_name
        }
    return render(request, 'my_project/list_view.html', context)

마지막 페이지는 Pagenator의 객체인 paginator에서 paginator.num_pages 속성으로 알 수 있습니다. 
시작 페이지는 1이죠. 어렵지 않습니다. 

아래 부분에서 페이지를 계속 내리다 보면 음수로 페이지 접근을 하는데 상당히 불편합니다.
커스텀 템플릿 필터를 만들면 됩니다. 

 

{% if page_number >= question_list.number|add:-5 and page_number <= question_list.number|add:5 %}

 

@register.filter
def sub(value, arg):
    """subtract"""
    return temp if (temp := value - arg) > 1 else 1
반응형