1. 程式人生 > >crm 系統專案(三) 自動分頁

crm 系統專案(三) 自動分頁

crm 系統專案(三) 自動分頁

需求:

  1. 做一個自動分頁, 每15條資料1頁

  2. 讓當前頁數在中間顯示

  3. 上一頁, 下一頁

注意情況:

  1.總頁數 小於 規定顯示的頁數

  2. 左右兩邊極值情況

  3. 前後端傳參,互動 

  

user_list.py

{% extends 'layout.html' %}

{% block content %}


    <table class="table table-bordered table-hover">
        <thead>
        <tr>
            <th>序號</th>
            <th>使用者名稱</th>
            <th>密碼</th>

        </tr>
        </thead>
        <tbody>
        {
% for user in all_user %} <tr> <td>{{ forloop.counter }}</td> <td>{{ user.name }}</td> <td>{{ user.pwd }}</td> </tr> {% endfor %} </tbody> </table> <nav aria-label="
Page navigation"> <ul class="pagination"> {{ page_html|safe }} </ul> </nav> {% endblock %}
urls.py

 

views.py

userlist= [{'name':'傻傻的兆滿{}號'.format(i),'pwd':'帥帥的灰灰{}號'.format(i)} for i in range(1,667)]

def user_list(request):
    try:
        page 
= int(request.GET.get('page', '1')) #獲取當前頁碼數 if page <= 0: page = 1 except Exception as e: page = 1 print(page) per_num = 15 # 每頁顯示的資料 all_count = len(userlist) #總的資料量 page_num, more = divmod(all_count, per_num) #商和餘數 if more: page_num += 1 max_show = 11 #最多顯示的分頁數 half_show = max_show // 2 #當前頁碼左面和右面各多少個, if page_num < max_show: page_start = 1 page_end = page_num else: if page <= half_show: page_start = 1 page_end = max_show elif page + half_show > page_num: page_start = page_num - max_show + 1 page_end = page_num else: page_start = page - half_show page_end = page + half_show start = (page - 1) * per_num end = page * per_num li_list = [] # 將分配好的頁碼,放入列表 if page == 1: li_list.append('<li class="disabled" ><a> << </a></li>') else: li_list.append('<li ><a href="?page={}"> << </a></li>'.format(page - 1)) for i in range(page_start, page_end + 1): if page == i: li_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i)) else: li_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i)) if page == page_num: li_list.append('<li class="disabled" ><a> >> </a></li>') else: li_list.append('<li ><a href="?page={}"> >> </a></li>'.format(page + 1)) page_html = ''.join(li_list) #列表變成字串 return render(request, 'user_list.html', {'all_user': userlist[start:end], 'page_num': range(page_start, page_end + 1), 'page_html': page_html},)
views.py

為了方便實用可以把整個分頁封裝起來, 

  在app下新建檔案 paginationg.py

  封裝分頁功能

# 封裝分頁
class Pagination:

    def __init__(self, page, all_count, per_num=15, max_show=11):
        try:
            page = int(page)
            if page <= 0:
                page = 1
        except Exception as e:
            page = 1
        self.page = page
        self.all_count = all_count
        self.per_num = per_num
        self.max_show = max_show
        # 總頁碼數
        self.page_num, more = divmod(all_count, per_num)
        if more:
            self.page_num += 1
        # 最多顯示頁碼數
        half_show = max_show // 2

        if self.page_num < max_show:
            # 總頁碼數不夠 最大顯示頁碼數
            self.page_start = 1
            self.page_end = self.page_num
        else:
            # 能顯示超過最大顯示頁碼數
            if page <= half_show:
                # 處理左邊的極值
                self.page_start = 1
                self.page_end = max_show
            elif page + half_show > self.page_num:
                # 處理右邊的極值
                self.page_start = self.page_num - max_show + 1
                self.page_end = self.page_num
            else:
                # 正常的情況
                self.page_start = page - half_show
                self.page_end = page + half_show

    @property
    def start(self):
        return (self.page - 1) * self.per_num

    @property
    def end(self):
        return self.page * self.per_num

    @property
    def page_html(self):
        li_list = []
        if self.page == 1:
            li_list.append('<li class="disabled" ><a> << </a></li>')
        else:
            li_list.append('<li ><a href="?page={}"> << </a></li>'.format(self.page - 1))

        for i in range(self.page_start, self.page_end + 1):
            if self.page == i:
                li_list.append('<li class="active"><a href="?page={}">{}</a></li>'.format(i, i))
            else:
                li_list.append('<li><a href="?page={}">{}</a></li>'.format(i, i))

        if self.page == self.page_num:
            li_list.append('<li class="disabled" ><a> >> </a></li>')
        else:
            li_list.append('<li ><a href="?page={}"> >> </a></li>'.format(self.page + 1))

        return ''.join(li_list)
paginationg.py

viewa.py下直接傳參呼叫

# 呼叫封裝好的分頁
from app1.utils.paginationg import Pagination
def user_list(request):
    pager = Pagination(request.GET.get('page','1'), len(user_list), per_num=10, max_show=15)
    return render(request, 'user_list.html',
                  {"all_user": userlist[pager.start:pager.end],
                   'page_html': pager.page_html
                   }, )
View Code