分页

前端

<nav aria-label="Page navigation">
    <ul class="pagination">
        {{ html_str }}
    </ul>
</nav>

后端

分页组件

from django.utils.safestring import mark_safe
import copy


class Pagination:
    def __init__(self, request, queryset, page_size=5):
        self.request = request
        self.request_get = copy.deepcopy(request.GET)
        self.request_get._mutable = True
        self.queryset = queryset
        self.page_size = page_size
        self.page = self.request.GET.get('page')
        if not self.page:
            self.page = 1
        elif not self.page.isdigit():
            self.page = 1
        self.page = int(self.page)
        if self.page < 1:
            self.page = 1
        self.page_len, end_count = divmod(self.queryset.count(), self.page_size)
        if end_count > 0:
            self.page_len += 1
        if self.page > self.page_len:
            self.page = self.page_len
        if self.queryset.count() == 0:
            self.start = 0
        else:
            self.start = (self.page - 1) * self.page_size
        self.end = self.page * self.page_size

    def html(self):
        html_str = ''
        start_page = self.page - 5
        end_page = self.page + 4
        if self.page - 1 < 1:
            self.request_get.setlist('page', [1])
        else:
            self.request_get.setlist('page', [self.page - 1])
        up_page = f'<li><a href="?{self.request_get.urlencode()}">上一页</a></li>'
        html_str += up_page
        self.request_get.setlist('page', [1])
        first_page = f'<li><a href="?{self.request_get.urlencode()}">首页</a></li>'
        html_str += first_page
        for i in range(start_page, end_page):
            current_page = i + 1
            if current_page < 1 or current_page > self.page_len:
                pass
            else:
                self.request_get.setlist('page', [current_page])
                if current_page == self.page:
                    item_str = f'<li class="active"><a href="?{self.request_get.urlencode()}">{current_page}</a></li>'
                else:
                    item_str = f'<li><a href="?{self.request_get.urlencode()}">{current_page}</a></li>'
                html_str += item_str
        if self.page_len == 0:
            self.request_get.setlist('page', [1])
        else:
            self.request_get.setlist('page', [self.page_len])
        minus_page = f'<li><a href="?{self.request_get.urlencode()}">尾页</a></li>'
        html_str += minus_page
        if self.page + 1 > self.page_len:
            if self.page_len == 0:
                self.request_get.setlist('page', [1])
            else:
                self.request_get.setlist('page', [self.page_len])
        else:
            self.request_get.setlist('page', [self.page + 1])
        down_page = f'<li><a href="?{self.request_get.urlencode()}">下一页</a></li>'
        html_str += down_page
        explain = f'<li class="disabled"><a href="#">共{self.page_len}页{self.queryset.count()}条数据</a></li>'
        html_str += explain
        return mark_safe(html_str)

    def query_set(self):
        return self.queryset[self.start:self.end]

视图层

def user_list(request):
    if request.method == 'GET':
        queryset = User.objects.filter(isAdmin=0).select_related('level')
        pagination = Pagination(request, queryset)
        return render(request, 'user/list.html',
                      {users': pagination.query_set(), 'html_str': pagination.html()})
posted @ 2022-09-13 17:12  Sherwin_szw  阅读(13)  评论(0编辑  收藏  举报