zoukankan      html  css  js  c++  java
  • Django分页器

    Django分页器

    当首页展示内容过多时,需要使用分页来讲数据传递给用户,这时就可以用到Django提供的分页器;

    批量向数据库中插入数据

    1.创建表:models.py

    from django.db import models
    
    class Book(models.Model):
        name=models.CharField(max_length=32)
        price=models.DecimalField(max_digits=7,decimal_places=2)
    

    2.创建路由url:urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^add/', views.add),
        url(r'^$', views.index, name="INDEX"),
        url(r'^index/', views.index,name="INDEX"),
    ]
    

    3.批量创建数据:views.py

    from django.shortcuts import render,HttpResponse,redirect
    from app01 import models
    
    def index(request):
        pass
    
    def add(request):
        Booklist=[]
        for i in range(100):
            # 生成book对象
            book_obj = models.Book(name="book"+str(i), price=30+i*i)
            Booklist.append(book_obj)
    
        # bulk_create 将实例化的 列表 插入到数据库中
        models.Book.objects.bulk_create(Booklist)
        return HttpResponse("OK")
    

    启动后通过url:http://127.0.0.1:8000/add/ 添加数据

    分页器Paginator模块的使用

    1.Paginator模块功能介绍:

    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def index(request):
        # 取出所有的书籍 100 条
        book_list=models.Book.objects.all()
    
        paginator=Paginator(book_list,10)          # 表示每页展示的条数
        
        print(paginator.count)                     # 统计一共有多少条数据
        print(paginator.num_pages)                 # 表示一共多少页
        print(paginator.page_range)                # range(1, 11) 页数的范围值
    
        page2=paginator.page(2)                    # 表示获取第二页的10条数据 book10--book19    
        
        # 根据当前页 判断是否有 上一页和下一页
        print(page2.has_next())                    # 是否有下一页
        print(page2.next_page_number())            # 下一页的页码
        print(page2.has_previous())                # 是否有上一页
        print(page2.previous_page_number())        # 上一页的页码
    

    输出:

    100
    10
    range(1, 11)
    
    True
    3
    True
    1
    

    分页器实现

    1.views.py设置:

    from django.shortcuts import render,HttpResponse,redirect
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    from app01 import models
    from django.urls import reverse
    # Create your views here.
    
    def index(request):
        # 查出所有书籍信息
        Book_list=models.Book.objects.all()
        paginator = Paginator(Book_list, 15)
        page = request.GET.get('page',"1")
        # 如果获取的值不为数字,把所有请求跳转到首页
        if page.isdigit():
            currentPage=int(page)
        else:
            currentPage = int(1)
        #  如果页数十分多时,可以使用固定显示页码个数
        if paginator.num_pages>30:
    
            if currentPage-5<1:
                pageRange=range(1,11)
            elif currentPage+5>paginator.num_pages:
                pageRange=range(currentPage-5,paginator.num_pages+1)
    
            else:
                pageRange=range(currentPage-5,currentPage+5)
    
        else:
            pageRange=paginator.page_range
    
        print("==============",pageRange)
        try:
            print(page)
            Book_list = paginator.page(page)
        except PageNotAnInteger:
            Book_list = paginator.page(1)
        except EmptyPage:
            Book_list = paginator.page(paginator.num_pages)
    
        return render(request,"index.html",locals())
    

    2.index.html设置:

       <ul class="pagination" id="pager">
                     {% if Book_list.has_previous %}
                        <li class="next"><a href="/index/?page=1">首页</a></li>
                        <li class="previous"><a href="/index/?page={{ Book_list.previous_page_number }}">上一页</a></li>
    
                     {% else %}
                        <li class="next active"><a href="/index/?page=1">首页</a></li>
                        <li class="previous disabled"><a>上一页</a></li>
                     {% endif %}
    
                     {# 获取 range(1, 11) 表示一个循环值 #}
                     {% for num in pageRange %}
    
                         {% if num == currentPage %}
                           <li class="item active"><a href="/index/?page={{ num }}">{{ num }}</a></li>
                         {% else %}
                           <li class="item"><a href="/index/?page={{ num }}">{{ num }}</a></li>
                         {% endif %}
    
                     {% endfor %}
    
                     {% if Book_list.has_next %}
                        <li class="next"><a href="/index/?page={{ Book_list.next_page_number }}">下一页</a></li>
                        <li class="next"><a href="/index/?page={{ paginator.num_pages }}">尾页</a></li>
                     {% else %}
                        <li class="next disabled"><a>下一页</a></li>
                        <li class="next active "><a href="/index/?page={{ paginator.num_pages }}">尾页</a></li>
                     {% endif %}
       </ul>
    
  • 相关阅读:
    JUC并发工具包之Semaphore
    Linux命令
    uWSGI
    数据库 MySQL 练习
    c++
    c++ 初阶
    Git
    MySQl 和 Redis
    MySQL 查询
    MySQL 命令
  • 原文地址:https://www.cnblogs.com/baolin2200/p/7920485.html
Copyright © 2011-2022 走看看