chan

朝生暮死不足笑 但悲百年不足道

【Django自定义组件】分页组件


from django.utils.safestring import mark_safe

"""
如果想要以后使用分页,需要以下两个步骤:
在视图函数:
    def customer_list(request):
        # 所有数据
        queryset = models.Customer.objects.filter(active=1).select_related('level')

        page = Pagination(request, queryset)
        context = {
            "queryset": queryset[pager.start:pager.end],
            "pager_string": obj.html()
        }
        return render(request, 'customer_list.html', context)

在页面上:
    {% for row in queryset %}
        {{row.id}}
    {% endfor %}

    <ul class="pagination">
        {{ pager_string }}
    </ul>
"""
from django.utils.safestring import mark_safe
import copy

class Pagination(object):
    """分页"""

    def __init__(self,request,query_set,per_page_count=10):
        self.query_dict = copy.deepcopy(request.GET)
        self.query_dict._mutable = True
        self.query_set = query_set

        total_count = query_set.count()
        self.total_count = total_count

        # 计算总共有多少页面
        self.total_page, div = divmod(total_count, per_page_count)
        if div:
            self.total_page += 1

        page = request.GET.get('page')
        if not page:
            page = 1
        else:
            if not page.isdecimal():
                page = 1
            else:
                page = int(page)
                if page <= 0:
                    page = 1
                else:
                    if page > self.total_page:
                        page = self.total_page

        self.page = page
        self.per_page_count = per_page_count

        self.start = (page - 1) * per_page_count
        self.end = page * per_page_count




    def html(self):
        page_list = []
        if not self.total_page:
            return ""

        plus = 5
        start_page = self.page - plus
        end_page = self.page + plus

        if self.total_page <= 11:
            start_page = 1
            end_page = self.total_page
        else:
            if self.page <= 6:
                start_page = 1
                end_page = 11
            else:
                if (self.page + 5) > self.total_page:
                    start_page = self.total_page - 2 * plus
                    end_page = self.total_page
                else:
                    start_page = self.page - plus
                    end_page = self.page + plus

        self.query_dict.setlist('page',[1])
        page_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))
        if self.page > 1:
            self.query_dict.setlist('page',[self.page - 1])
            page_list.append('<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode()))
        for i in range(start_page, end_page + 1):
            self.query_dict.setlist('page',[i])
            if i == self.page:
                item = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            else:
                item = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            page_list.append(item)

        if self.page < self.total_page:
            self.query_dict.setlist('page',[self.page + 1])
            page_list.append('<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode()))

        self.query_dict.setlist('page', [self.total_page])
        page_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))
        page_list.append('<li class="disabled"><a>数据{}条{}页</a></li>'.format(self.total_count,self.total_page))
        page_string = mark_safe(''.join(page_list))

        return page_string


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



评论
还没有评论
    发表评论 说点什么