分页器

向数据库批量插入数据:

  models:

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

  views:

def index(request):
    book_list = []
    for i in range(100):
        book = Book(title='book_%s' % i, price=i * i)
        book_list.append(book)
    Book.objects.bulk_create(book_list) ######批量插入多条数据
    return HttpResponse('ok')
知识兔

分页:

  Paginator的简单使用:

from django.core.paginator import Paginator,EmptyPage ###分页器, 报错
def index(request):
    book_list = Book.objects.all()
    paginator = Paginator(book_list,10)#10 ==>每页10条数据
    # print(paginator.count)#数据总数
    # print(paginator.num_pages)#总页数
    # print(paginator.page_range)#页码列表
    # p1 = paginator.page(1)
    # print(p1.object_list)
    # for i in p1:
    #     print(i) #i.title i.price
    try:
        current_page = int(request.GET.get("page",1))  #####地址栏http://127.0.0.1:8000/app01/index/?page=2
        page = paginator.page(current_page)
    except EmptyPage:
        page = paginator.page(1)
    return render(request,'index.html',locals())
知识兔
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {% for book in page %}
            <li>{{ book.title }}--{{ book.price }}</li>
        {% endfor %}
    </ul>
</body>
</html>
知识兔

  跳转+点击样式:引入bootstrap

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://zhishitu.com" style="color: #800000;">"https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
    <ul>
        {% for book in page %}
            <li>{{ book.title }}--{{ book.price }}</li>
        {% endfor %}
    </ul>
<nav aria-label="Page navigation">
  <ul class="pagination">
    <li>
      <a href="https://zhishitu.com" style="color: #800000;">"#" aria-label="Previous">
        <span aria-hidden="true">上一页</span>
      </a>
    </li>
      {% for item in paginator.page_range %}
          {% if current_page == item  %}
               <li class="active"><a href="https://zhishitu.com" style="color: #800000;">"?page={{ item }}">{{ item }}</a></li> ########3?page ={{item}} 跳转页面
              {% else %}
               <li><a href="https://zhishitu.com" style="color: #800000;">"?page={{ item }}">{{ item }}</a></li>
          {% endif %}
      {% endfor %}
    <li>
      <a href="https://zhishitu.com" style="color: #800000;">"#" aria-label="Next">
        <span aria-hidden="true">下一页</span>
      </a>
    </li>
  </ul>
</nav>
</body>
</html>
知识兔
from django.shortcuts import render,HttpResponse
from django.core.paginator import Paginator,EmptyPage
from myforms.models import *
# Create your views here.
def index(request):
    book_list = Book.objects.all()
    paginator = Paginator(book_list,10)
    try:
        current_page = int(request.GET.get("page",1))
        page = paginator.page(current_page)
    except EmptyPage:
        page = paginator.page(1)
    return render(request,'index.html',locals())
知识兔

上一页 下一页:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://zhishitu.com" style="color: #800000;">"https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<ul>
    {% for book in page %}
        <li>{{ book.title }}--{{ book.price }}</li>
    {% endfor %}
</ul>
<nav aria-label="Page navigation">
    <ul class="pagination">
        {% if page.has_previous %} ########判断有没有上一页
            <li>
                <a href="https://zhishitu.com" style="color: #800000;">"?page={{ current_page|add:-1 }}" aria-label="Previous">  ########跳转-1
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
        {% else %}
            <li class="disabled"><a href="https://zhishitu.com" style="color: #800000;">"#" aria-label="Previous">    ######没有上一页禁止点击
                <span aria-hidden="true">上一页</span>
            </a></li>
        {% endif %}
        {% for item in paginator.page_range %}
            {% if current_page == item %}
                <li class="active"><a href="https://zhishitu.com" style="color: #800000;">"?page={{ item }}">{{ item }}</a></li>
            {% else %}
                <li><a href="https://zhishitu.com" style="color: #800000;">"?page={{ item }}">{{ item }}</a></li>
            {% endif %}
        {% endfor %}
        {% if page.has_next %}
            <li>
                <a href="https://zhishitu.com" style="color: #800000;">"?page={{ current_page|add:+1 }}" aria-label="Next">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
        {% else %}
            <li class="disabled">
                <a href="https://zhishitu.com" style="color: #800000;">"#" aria-label="Next">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
        {% endif %}
    </ul>
</nav>
</body>
</html>
知识兔

控制分页显示数量(最终):

后端
def index(request):
    book_list = Book.objects.all()
    paginator = Paginator(book_list,3)
    current_page = int(request.GET.get("page", 1))
    if paginator.num_pages >=11:          ####### 把page_range给前端
        if current_page-5 < 0 :     
            page_range= range(1,current_page+5)
        elif current_page+5>=paginator.num_pages:
            page_range = range(current_page-5,paginator.num_pages+1)
        else:
            page_range = range(current_page - 5, current_page + 5)
    else: ###小于11正常显示
        page_range = paginator.page_range
    try:
        page = paginator.page(current_page)
        print(page.has_next())
        print(page.has_previous())
    except EmptyPage:
        page = paginator.page(1)
    return render(request,'index.html',locals())
知识兔
前端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://zhishitu.com" style="color: #800000;">"https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<ul>
    {% for book in page %}
        <li>{{ book.title }}--{{ book.price }}</li>
    {% endfor %}
</ul>
<nav aria-label="Page navigation">
    <ul class="pagination">
        {% if page.has_previous %}
            <li>
                <a href="https://zhishitu.com" style="color: #800000;">"?page={{ current_page|add:-1 }}" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
        {% else %}
            <li class="disabled"><a href="https://zhishitu.com" style="color: #800000;">"#" aria-label="Previous">
                <span aria-hidden="true">上一页</span>
            </a></li>
        {% endif %}
        {% for item in page_range %}
            {% if current_page == item %}
                <li class="active"><a href="https://zhishitu.com" style="color: #800000;">"?page={{ item }}">{{ item }}</a></li>
            {% else %}
                <li><a href="https://zhishitu.com" style="color: #800000;">"?page={{ item }}">{{ item }}</a></li>
            {% endif %}
        {% endfor %}
        {% if page.has_next %}
            <li>
                <a href="https://zhishitu.com" style="color: #800000;">"?page={{ current_page|add:+1 }}" aria-label="Next">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
        {% else %}
            <li class="disabled">
                <a href="https://zhishitu.com" style="color: #800000;">"#" aria-label="Next">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
        {% endif %}
    </ul>
</nav>
</body>
</html>
知识兔
计算机