"""
在视图函数中，
def samplerlist(request):
    search_dict = {}
    search_key = request.GET.get('q', '')
    if search_key:
        search_dict["key"] = search_key
    data = models.xxx.objects.filter(**search_dict).order_by('-id')
    page_object = Pagination(request, data, )
    context = {
        'data': page_object.queryset,
        'search_key': search_key,
        'page_string': page_object.html()
    }
    在 模板页面中
     {{ page_string }}

"""

from django.utils.safestring import mark_safe
import copy

class Pagination(object):
    def __init__(self, request, queryset, page_param='page', page_size=10, page_plus=5, show_prev_next=True,
                 show_first_end=True):
        """
        :param request:页面request
        :param queryset: 未分页前的dataset
        :param page_param: 分页参数名
        :param page_size:分页大小
        :param page_plus: 显示当前页的前后几页
        :param show_prev_next:是否显示上一页和下一页
        :param show_first_end:是否显示首页和尾页
        """

        query_dict=copy.deepcopy(request.GET)
        query_dict._mutable=True
        self.query_dict=query_dict


        page = request.GET.get(page_param, '1')
        if page.isdecimal():
            page = int(page)
        else:
            page = 1

        self.page = page
        self.page_size = page_size
        self.page_param=page_param
        self.page_plus = page_plus
        self.start = (page - 1) * page_size
        self.end = page * page_size
        self.show_prev_next = show_prev_next
        self.show_first_end = show_first_end

        self.queryset = queryset[self.start: self.end]

        self.total_count = queryset.count()
        total_page_count, div = divmod(self.total_count, self.page_size)
        if div:
            total_page_count += 1
        self.total_page_count = total_page_count

    def html(self):
        if self.total_page_count <= 2 * self.page_plus + 1:
            """数据小于11页"""
            start_page = 1
            end_page = self.total_page_count
        else:
            """数据大于等于11页"""
            if self.page <= self.page_plus:
                """当前页小于plus时"""
                start_page = 1
                end_page = 2 * self.page_plus + 1
            else:
                # 当前页大于plus
                # 如果当前前码加上plus超出了所有页码
                if (self.page + self.page_plus) > self.total_page_count:
                    start_page = self.total_page_count - 2 * self.page_plus
                    end_page = self.total_page_count
                else:
                    start_page = self.page - self.page_plus
                    end_page = self.page + self.page_plus

        page_str_list = ['<ul class="pagination">']
        if self.page > 1:
            if self.show_first_end:
                self.query_dict.setlist(self.page_param, [1])
                page_str_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))
            if self.show_prev_next:
                self.query_dict.setlist(self.page_param, [self.page - 1])
                page_str_list.append('<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode()))
        else:
            if self.show_first_end:
                page_str_list.append('<li  class="disabled"><span>首页</span></li>')
            if self.show_prev_next:
                page_str_list.append('<li class="disabled"><span>上一页</span></li>')


        for i in range(start_page, end_page + 1):
            if i == self.page:  # 当前页
                ele = '<li class="active"><span>{}</span></li>'.format(i)
            else:
                self.query_dict.setlist(self.page_param, [i])
                ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            page_str_list.append(ele)

        if self.page < self.total_page_count:
            if self.show_prev_next:
                self.query_dict.setlist(self.page_param, [self.page + 1])
                page_str_list.append('<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode()))
            if self.show_first_end:
                self.query_dict.setlist(self.page_param, [self.total_page_count])
                page_str_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))
        else:
            if self.show_prev_next:
                page_str_list.append('<li class="disabled"><span>下一页</span></li>')
            if self.show_first_end:
                page_str_list.append('<li  class="disabled"><span>尾页</span></li>')

        # 跳转
        # search_string = """
        #             <li>
        #                 <form style="float:left;margin-left:-1px" method="get">
        #                     <input name="page"
        #                            style="position:relative;float:left;display:initial-block;width: 80px;border-radius: 0"
        #                            type="text" class="form-control" placeholder="页码">
        #                     <button style="border-radius: 0" class="btn btn-default" type="submit">跳转</button>
        #                 </form>
        #             </li>
        # """
        # page_str_list.append(search_string)
        page_str_list.append('</ul>')

        page_string = "".join(page_str_list)

        return mark_safe(page_string)