django分頁設計並封裝

1、封裝後的代碼css

2、在視圖函數中如何調用html

3、get點bootstrap

 

 

1、封裝後的代碼app

 1 class Page():
 2 
 3     def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
 4         """
 5 
 6         :param page_num: 當前頁碼數
 7         :param total_count: 數據總數
 8         :param url_prefix: a標籤href的前綴
 9         :param per_page: 每頁顯示多少條數據
10         :param max_page: 頁面上最多顯示幾個頁碼
11         """
12         self.url_prefix = url_prefix
13         self.max_page = max_page
14         # 每一頁顯示多少條數據
15         # 總共須要多少頁碼來展現
16         total_page, m = divmod(total_count, per_page)
17         if m:
18             total_page += 1
19         self.total_page = total_page
20 
21         try:
22             page_num = int(page_num)
23             # 若是輸入的頁碼數超過了最大的頁碼數,默認返回最後一頁
24             if page_num > total_page:
25                 page_num = total_page
26         except Exception as e:
27             # 當輸入的頁碼不是正經數字的時候 默認返回第一頁的數據
28             page_num = 1
29         self.page_num = page_num
30 
31         # 定義兩個變量保存數據從哪兒取到哪兒
32         self.data_start = (page_num - 1) * 10
33         self.data_end = page_num * 10
34 
35         # 頁面上總共展現多少頁碼
36         if total_page < self.max_page:
37             self.max_page = total_page
38 
39         half_max_page = self.max_page // 2
40         # 頁面上展現的頁碼從哪兒開始
41         page_start = page_num - half_max_page
42         # 頁面上展現的頁碼到哪兒結束
43         page_end = page_num + half_max_page
44         # 若是當前頁減一半 比1還小
45         if page_start <= 1:
46             page_start = 1
47             page_end = self.max_page
48         # 若是 當前頁 加 一半 比總頁碼數還大
49         if page_end >= total_page:
50             page_end = total_page
51             page_start = total_page - self.max_page + 1
52         self.page_start = page_start
53         self.page_end = page_end
54 
55     @property
56     def start(self):
57         return self.data_start
58 
59     @property
60     def end(self):
61         return self.data_end
62 
63 
64     def page_html(self):
65         # 本身拼接分頁的HTML代碼
66         html_str_list = []
67         # 加上第一頁
68         html_str_list.append('<li><a href="{}?page=1">首頁</a></li>'.format( self.url_prefix))
69 
70         # 判斷一下 若是是第一頁,就沒有上一頁
71         if self.page_num <= 1:
72             html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'.format(self.page_num-1))
73         else:
74             # 加一個上一頁的標籤
75             html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format( self.url_prefix, self.page_num-1))
76 
77         for i in range(self.page_start, self.page_end+1):
78             # 若是是當前頁就加一個active樣式類
79             if i == self.page_num:
80                 tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)
81             else:
82                 tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format( self.url_prefix, i)
83 
84             html_str_list.append(tmp)
85 
86         # 加一個下一頁的按鈕
87         # 判斷,若是是最後一頁,就沒有下一頁
88         if self.page_num >= self.total_page:
89             html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">&raquo;</span></a></li>')
90         else:
91             html_str_list.append('<li><a href="{}?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format( self.url_prefix, self.page_num+1))
92         # 加最後一頁
93         html_str_list.append('<li><a href="{}?page={}">尾頁</a></li>'.format( self.url_prefix, self.total_page))
94 
95         page_html = "".join(html_str_list)
96         return page_html
mypage.py

 

2、在視圖函數中如何調用ide

 1 from app.mypage import Page
 2 
 3 def books(request):
 4     # 以參數形式獲得當前的page頁
 5     page_num = request.GET.get('page')
 6     total_count = models.Book.objects.all().count()
 7     page_obj = Page(page_num, total_count, url_prefix='/books/')
 8     ret = models.Book.objects.all()[page_obj.start: page_obj.end]
 9     page_html = page_obj.page_html()
10     return render(request, 'books.html', {'books': ret, 'page_html': page_html})
views.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>test demo</title>
 6     <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
 7 </head>
 8 <body>
 9 <div class="container">
10     <table class="table table-bordered">
11         <thead>
12         <tr>
13             <th>number</th>
14             <th>id</th>
15             <th>name</th>
16         </tr>
17         </thead>
18         <tbody>
19         {% for book in books %}
20             <tr>
21                 <td>{{ forloop.counter }}</td>
22                 <td>{{ book.id }}</td>
23                 <td>{{ book.name }}</td>
24             </tr>
25         {% endfor %}
26         </tbody>
27     </table>
28     <nav aria-label="Page navigation">
29         <ul class="pagination">
30             {{ page_html|safe }}
31         </ul>
32     </nav>
33 
34 </div>
35 </body>
36 </html>
books.html

 

3、get點函數

1.未封裝的代碼oop

 1 def books(request):
 2     page_num = request.GET.get("page")  # 127.0.0.1:8000/book/?page=1
 3     #  每頁顯示多少數據
 4     per_page = 10
 5     #  總數據是多少
 6     total_count = models.Book.objects.all().count()
 7     #  總共須要多少頁碼來展現
 8     total_page, m = divmod(total_count, per_page)  # divmod(23, 3);divmod(20,0)
 9     if m:
10         total_page += 1
11     try:
12         page_num = int(page_num)  # 獲得的page參數是字符串形式的
13         if page_num > total_page:
14             page_num = total_page
15     except Exception as e:
16         # 當輸入的頁碼不是數字的時候,默認返回第一頁
17         page_num = 1
18 
19     data_start = (page_num-1)*10
20     data_end = (page_num)*10
21 
22     # 頁面上總共展現多少頁碼
23     max_page = 11
24     half_max_page = max_page //2
25 
26     # 頁面展現的頁面從哪開始
27     page_start = page_num - half_max_page
28     page_end = page_num + half_max_page
29     if page_start <= 1:
30         page_start = 1
31         page_end = max_page + 1
32 
33     # 若是當前頁加上一半 比總頁碼數還大
34     if page_end >= total_page:
35         page_end = total_page
36         page_start = total_page - max_page
37 
38     # 每一頁取10個值
39     all_book = models.Book.objects.all()[data_start:data_end]
40 
41     # 本身拼接分頁的html代碼
42     html_str_list = []
43     # 加上第一頁
44     html_str_list.append('<li><a href="/books/?page=1">第一頁</li>')
45 
46     # 加上上一頁
47     if page_num <= 1:
48         html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>')
49     else:
50 
51         html_str_list.append('<li><a href="/books/?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format(page_num-1))
52 
53     for i in range(page_start, page_end):
54         # 若是是當前頁就加一個active樣式
55         if i == page_num:
56             tmp = '<li class="active"><a href="/books/?page={0}">{0}</li>'.format(i)
57         else:
58             tmp = '<li><a href="/books/?page={0}">{0}</li>'.format(i)
59         html_str_list.append(tmp)
60     # 加上下一頁
61     if page_num >= total_page:
62         html_str_list.append('<li class="disabled"><a href="#"><span aria-hidden="true">&raquo;</span></a></li>')
63     else:
64         html_str_list.append('<li><a href="/books/?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(page_num+1))
65     # 加上最後一頁
66 
67     html_str_list.append('<li><a href="/books/?page={}">尾頁</li>'.format(total_page))
68 
69     page_html = ''.join(html_str_list)
70 
71     return render(request, 'books.html', {'books': all_book, 'page_html': page_html})
未封裝的代碼.py

2.divmodurl

>>>divmod(22, 3)
>>>(7, 1)

>>>divmod(20, 2)
>>>(10, 0)

>>>divmod(23, 2)
>>>(11, 1)

3.'/' 和 '//' 的返回值spa

>>>10/2
>>>5.0  # 浮點數

>>>10//2
>>>5  # 整數

>>>abs(-10)
>>>10  # 絕對值

4.ORM是對象,有索引值code

>>>models.Book.objects.all()  # QuerySet對象
>>>models.Book.objects.all()[0: 3]  #能夠根據索引取值

5.上一頁和下一頁圖標

&laquo  # 上一頁 <<

&raquo  # 下一頁 >>

6.url參數傳到後臺的類型是str

7.list轉爲str

>>>li = ['1', '2', '3', '4', '5']
>>>new_li = ''.join(li)
>>>new_li
>>>'12345'

>>>new_li = ' '.join(li)
>>>new_li
>>>'1 2 3 4 5'
相關文章
相關標籤/搜索