Day 58 分页器的使用

1.自带的Django 分页器。

使用的是publish_list中的代码:

模板函数代中的代码:

  <div class="col-lg-8 col-lg-offset-4">
                    <nav aria-label="Page navigation">
                        <ul class="pagination">
                            <li><a href="?page=1">首页</a></li>
                            {% if page.has_previous %}
                                <li><a href="?page={{ page.previous_page_number }}">上一页</a></li>
                            {% else %}
                                <li class="disabled"><a href="javascript:void(0);">上一页</a></li>
                            {% endif %}
{#                        方式二一旦把paginator 显示的条数改小之后就会出现错误,于是在后端就行限制page_range再传过来#}
{#                          方式一有缺陷的  {% for num in paginator.page_range %}#}
                         {% for num in page_range %}
                                {% if current_page == num %}
                                    <li class="active"><a href="?page={{ num }}">{{ num }}</a></li>
                                {% else %}
                                    <li><a href="?page={{ num }}">{{ num }}</a></li>
                                {% endif %}
                            {% endfor %}
                            {% if page.has_next %}
                                 <li><a href="?page={{ page.next_page_number }}">下一页</a></li>
                            {% else %}
                                <li class="disabled"><a href="javascript:void(0);">下一页</a></li>
                            {% endif %}
                            <li><a href="?page={{ paginator.num_pages }}">尾页</a></li>
                        </ul>
                    </nav>
                </div>

视图函数代码:

# 出版社的展示
@login_required
def publish_list(request):
    # 创建publish数据
    # 本次创建数据的效率较低
    # for i in range(1, 101):
    #     models.Publish.objects.create(name="希望出版社_%s" % i, city="成都_%s区" % i, email="[email protected]")  # 执行效率低
    publish_list = models.Publish.objects.all()
    paginator = Paginator(publish_list, 8)
  # 防止第一次输入publish_list的时候,没有page导致错误,于是有了try 和excepttion 如果没有设置那么current_page = 1
try: current_page = int(request.GET.get("page")) except Exception as e: current_page = 1 page = paginator.get_page(current_page) # 获取当前页码的所有数据 # 为防止就行每次显示条数改小之后,出现太多的paginator.page_range从而显示在页面上,就行下面的设置 # 我们按照页面显示11个页码为例。 # 如果总页码大于11 # 第一步 if paginator.num_pages > 11: if current_page - 5 < 1: # 当前页小于中间页码时 page_range = range(1, 12) elif current_page + 5 > paginator.num_pages: # 当前页大于中间页码时 page_range = range(paginator.num_pages - 10, paginator.num_pages + 1) else: page_range = range(current_page - 5, current_page + 6) else: page_range = paginator.page_range # 第二步 将对应的模板中的paginator.page_range改成page_range即可, return render(request, "publish_list.html", {"paginator": paginator, "page": page, "current_page": current_page, "page_range": page_range})

2.终极版的模板函数代码:在图书管理系统中是使用的book_list.来实现的。视图函数是book_list_base,之前使用过模板继承的,携带参数。

<table class="table table-striped table-hover">
            <thead>
            <tr>
                <th>序号</th>
                <th>书名</th>
                <th>价格</th>
                <th>出版社</th>
                <th>作者</th>
                <th>出版时间</th>
                <th>编辑</th>
            </tr>
            </thead>
            <tbody>
            {% for book in book_list %}
                <tr>
                    <td>{{ forloop.counter }}</td>
                    <td>{{ book.title }}</td>
                    <td>{{ book.price }}</td>
                    <td>{{ book.publish.name }}</td>
                    <td>
                        {% for au in book.authors.all %}
                            {{ au.name }} |
                        {% endfor %}
                    </td>

                    <td>
                        {{ book.pub_date|date:'Y-m-d' }}
                    </td>
                    <td>
                        <button class="btn btn-danger btn-xs del_btn" book_pk="{{ book.pk }}">删除</button>
                        |
                        <button class="btn btn-info btn-xs"><a
                                href="http://127.0.0.1:8000/edit_book_list/?pk={{ book.pk }}">编辑</a></button>
                    </td>
                </tr>

            {% endfor %}

            </tbody>
        </table>
        <div class="col-lg-8 col-lg-offset-4">
            {{ paginator.page_html|safe }}
        </div>
   

其中分页的html文件是通过后端的类实现创建好的代码,传过来的。

视图函数中的代码:

 利用作者展示部分就行,最终版的展示
@login_required
def author_book(request):
    # is_login = request.session.get('is_login')
    # if not is_login:
    # return redirect("/login/")
    author_list = models.Author.objects.all()
    # 先创建AuthorDetail.数据
    # 本次创建数据的效率较低
    # for i in range(10, 110):
    #     models.AuthorDetail.objects.create(gender=random.randrange(0, 2), tel=18228069171, addr="成都", birthday="2019-07-18")
    # 第二步再创建Author数据
    # for i in range(10, 110):
    #     models.Author.objects.create(name="芒果鱼_%s" % i, age=random.randrange(10, 30), au_detail_id=i)
    from app01.zhongji import Paginator
    current_page = request.GET.get('page')
    paginator = Paginator(request, current_page, author_list.count(), 8, 11)
    book_list = author_list[paginator.start: paginator.end]

    return render(request, "author_list.html", {"author_list": book_list, "paginator": paginator, "current_page": current_page})
    # return render(request, "author_list.html", {'author_list': author_list})# 之前的没使用分页就行全部展示的返回值

视图函数中传入的参数。

其中类文件,zhongji.py代码:

class Paginator:
    def __init__(self, request, current_page, all_count, per_page=10, max_page_num=13):
        """
        封装分页相关数据
        :param current_page:  当前页码
        :param all_count:  数据库中的数据总条数
        :param per_page:   每个页面显示的数据条数
        :param max_page_num:  最多显示的页码个数
        :param num_pages:  通过总条数/每个页面显示的条数,求出总页数
        """
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1
        if current_page < 1:
            current_page = 1
        self.current_page = current_page
        self.all_count = all_count
        self.per_page = per_page

        # 计算总页数
        num_pages, temp = divmod(all_count, per_page)
        if temp:
            num_pages += 1
        self.num_pages = num_pages

        self.max_page_num = max_page_num  # 11
        self.page_count_half = int((self.max_page_num - 1) / 2)  # 5

        import copy
        self.url_args = copy.deepcopy(request.GET)
        print(self.url_args.urlencode())


        """
        self.num_pages=100
        per_page=8

        current_page =1     [0:8]
        current_page =2     [8:16]
        current_page =3     [16:24]
                            [(current_page-1)*per_page:current_page*per_page ]

        """

    @property
    def start(self):
        return (self.current_page - 1) * self.per_page

    @property
    def end(self):
        return self.current_page * self.per_page

    def page_html(self):
        # 如果总页数小于self.max_page_num(最多显示的页码个数)
        if self.num_pages <= self.max_page_num:
            page_start = 1
            page_end = self.num_pages + 1
        else:
            # 如果当前页码<=页面上最多显示11/2个页码时
            if self.current_page <= self.page_count_half:
                page_start = 1
                page_end = self.max_page_num + 1
            # 如果当前页码+最多显示11/2 大于 总页数时
            elif self.current_page + self.page_count_half > self.num_pages:
                page_start = self.num_pages - self.max_page_num + 1
                page_end = self.num_pages + 1
            else:
                page_start = self.current_page - self.page_count_half
                page_end = self.current_page + self.page_count_half + 1

        page_html_list = []

        # 首页
        self.url_args['page'] = 1
        first_page = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>' % (self.url_args.urlencode())
        page_html_list.append(first_page)

        # 上一页
        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="javascript:void(0);">上一页</a></li>'
        else:
            self.url_args['page'] = self.current_page - 1
            prev_page = '<li><a href="?%s">上一页</a></li>' % (self.url_args.urlencode(), )
        page_html_list.append(prev_page)

        # 显示页码
        for i in range(page_start, page_end):
            self.url_args['page'] = i
            if self.current_page == i:
                temp = '<li class="active"><a href="?%s">%s</a></li>' % (self.url_args.urlencode(), i)
            else:
                temp = '<li><a href="?%s">%s</a></li>' % (self.url_args.urlencode(), i)
            page_html_list.append(temp)

        # 下一页
        if self.current_page >= self.num_pages:
            next_page = '<li class="disabled"><a href="javascript:void(0);">下一页</a></li>'
        else:
            self.url_args['page'] = self.current_page + 1
            next_page = '<li><a href="?%s">下一页</a></li>' % (self.url_args.urlencode(), )
        page_html_list.append(next_page)

        # 尾页
        self.url_args['page'] = self.num_pages
        last_page = '<li><a href="?%s">尾页</a></li></ul></nav>' % self.url_args.urlencode()
        page_html_list.append(last_page)

        return "".join(page_html_list)

猜你喜欢

转载自www.cnblogs.com/longerandergou/p/11210333.html
58
今日推荐