Django制作分页器

1.先在app01中建表:

class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.DecimalField(decimal_places=2,max_digits=8)

然后在终端写入python3 manage.py makemigrations ,python3 manage.py migrate写入到自带的数据库中
2.写路由,分配函数,制造数据

  2.1写路由

from django.contrib import admin
from django.urls import path,re_path
from app01 import views as v1
urlpatterns = [
   
    #分页器操作
    path('fenye/',v1.fenye)
]

 2.2分配函数 ,制造数据(在浏览器访问路由时就写进去了)

def fenye(request):
   ''' #批量插入
    book_list=[]
    for i in range(100):
        book=Book(title="book_%s"%i,price=i)
        book_list.append(book)

    Book.objects.bulk_create(book_list)

然后就生成了一百条数据 

 3.写逻辑,写视图(都标注了)

  3.1逻辑

from django.core.paginator import Paginator,EmptyPage #导入分页器;在浏览器输入框输入的值不合法时 try一下
def fenye(request):
   ''' #批量插入
    book_list=[]
    for i in range(100):
        book=Book(title="book_%s"%i,price=i)
        book_list.append(book)

    Book.objects.bulk_create(book_list)

    return render(request,"fenye.html")
'''
   book=Book.objects.all()

   # 分页器

   page_obj=Paginator(book,3)#一页分几个数据

   print('count :',page_obj.count) #数据总数
   # count: 100
   print('num_pages :',page_obj.num_pages) #总页数
   # num_pages: 13
   print('page_range :',page_obj.page_range) #页码的列表
   # page_range: range(1, 14)

   page_num = int(request.GET.get("page", 1))  # 默认给其第一页 page是url后的参数
   print(page_num)#6 指当前点击的页数
   if page_obj.num_pages>11: #前边数据 总页数

      if page_num-5<1:
          page_range =range(1,12)
      elif page_num+5>page_obj.num_pages:
          page_range=range(page_obj.num_pages-10,page_obj.num_pages+1)
      else:#当不满足时显示其页面
          page_range = range(page_num - 5, page_num + 6)



   else:
       page_range=page_obj.page_range

   try:
        #拿第几页数据的方式
        page_num=int(request.GET.get("page",1)) #默认给其第一页 page是url后的参数 (意思是第几页)
        page1=page_obj.page(page_num)#得到第几页页的数据
        print(page1)#<Page 9 of 50>
        #方式1
        print("object_list:",page1.object_list)
        # object_list: <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>, <Book: Book object (6)>, <Book: Book object (7)>, <Book: Book object (8)>]>
        #方式二
        for i in page1:
           print(i) #拿到的是一个个对象,可以.title拿到书籍的名字
   except EmptyPage as e :
       page1 = page_obj.page(1) #出错给其page为1的页

       # 查看页数http://127.0.0.1:8000/fenye/?page=15





   return render(request,"fenye.html",locals())

 3.2视图(fenye.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body>
{#<h3>插入成功</h3>#}

<ul>
{#    循环当前的page#}
    {% for b in page1 %}
        <li>{{ b.title }}:{{ b.price }}</li>

    {% endfor %}
<nav aria-label="Page navigation">
  <ul class="pagination">
{#  判断是否有上一页#}
   {% if page1.has_previous %}
    <li>
      <a href="?page={{page1.previous_page_number }}" aria-label="Previous">{# 获取当前页  #}
        <span aria-hidden="true">上一页</span>

      </a>
    </li>
   {% else %}
     <li class="disabled">
      <a href="" aria-label="Previous">
        <span aria-hidden="true" >上一页</span>
      </a>
    </li>

   {% endif %}


{#   点击页数给其颜色#}
    {% for item in page_range %}
        {% if page_num == item %}
             <li class="active"><a href="?page={{ item }}">{{ item }}</a> </li>
           {% else %}
             <li ><a href="?page={{ item }}">{{ item }}</a> </li>
        {% endif %}

    {% endfor %}


{# 判断是否有下一页#}
   {% if page1.has_next %}
   <li>
      <a href="?page={{ page1.next_page_number}}" aria-label="Next">
        <span aria-hidden="true">下一页</span>
      </a>
    </li>
   {% else %}
       <li class="disabled">
       <a href="" aria-label="Next">
        <span aria-hidden="true">下一页</span>
      </a>
    </li>
   {% endif %}



  </ul>
</nav>

</ul>

</body>
</html>

结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值