分页器

1.分页器

作用:干啥的?数据量大的话,可以分页获取,查看。

2.一次性插入多条数据

def add1(request):
    # 这样for循环会造成对数据库的大量访问,不建议这样添加
    # models.Book.objects.create(name='连城诀%s'%i,price=10+i)
    ll=[]
    for i in range(100):
        ll.append(models.Book(name='连城诀%s' %i,price=10+i))
    #批量插入,两个参数,第一个是对象列表,第二个是一次插入的数据量,不填,默认一次全插入
    models.Book.objects.bulk_create(ll)
    return HttpResponse('OJ8K')
View Code

在这里注意要使用批量插入,减少访问mysql数据库的次数

3.分页器代码

book_list = models.Book.objects.get_queryset().order_by('id')#当分页提示报警时,可以order by id一下

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="/static/jquery-3.3.1.js"></script>
    {% load static %}
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
    <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
    <title>Title</title>
</head>
<body>
<div class="col-md-6 col-md-offset-3">
    <div class="row">
        <table class="table table-bordered">
            <thead>
            <tr>
                <td>书名</td>
                <td>价格</td>
            </tr>
            </thead>
            <tbody>
            {% for book in current_page %}
                <tr>
                    <td>{{ book.name }}</td>
                    <td>{{ book.price }}</td>
                </tr>
            {% endfor %}
            </tbody>
        </table>
    </div>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            {% if current_page.has_previous %}
                <li>
                    <a href="/booklist/?page={{ current_page.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 foo in page_range %}
                {% if current_page_num ==  foo %}
                    <li class="active"><a href="/booklist/?page={{ foo }}">{{ foo }}</a></li>
                {% else %}
                    <li><a href="/booklist/?page={{ foo }}">{{ foo }}</a></li>
                {% endif %}
            {% endfor %}
            {% if current_page.has_next %}
                <li>
                    <a href="/booklist/?page={{ current_page_num|add:1 }}" 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>
</div>

</body>
</html>
View Code

后台代码

from django.shortcuts import render, HttpResponse, reverse, redirect
from app01 import models
from django.http import JsonResponse
from django.core.paginator import Paginator, EmptyPage


# Create your views here.
def index(request):
    return render(request, 'index.html')


def login(request):
    dic = {'status': 100, 'msg': None}
    name = request.POST.get('name')
    password = request.POST.get('password')
    user = models.User.objects.filter(name=name, password=password)
    print(request.POST)
    if user:
        dic['msg'] = '登录成功'
        return JsonResponse(dic)
    else:
        dic['status'] = 101
        dic['msg'] = '用户名或密码错误'
        return JsonResponse(dic)


def add1(request):
    # 这样for循环会造成对数据库的大量访问,不建议这样添加
    # models.Book.objects.create(name='连城诀%s'%i,price=10+i)
    ll = []
    for i in range(100):
        ll.append(models.Book(name='连城诀%s' % i, price=10 + i))
    # 批量插入,两个参数,第一个是对象列表,第二个是一次插入的数据量,不填,默认一次全插入
    models.Book.objects.bulk_create(ll)
    return HttpResponse('OJ8K')


# def booklist(request):
#     if request.method=='GET':
#         #查询所有图书
#         books=models.Book.objects.all()
#         from django.core.paginator import Paginator#导入分页器
#         #分页器,类。要实例化产生对象,要传两个参数:object_list:对象列表,per_page:每页显示的条数
#         paginator=Paginator(books,10)
#         # print(paginator.count)#打印总条数
#         # print(paginator.num_pages)#打印总页数
#         # print(paginator.page_range)#页码数的列表
#         current_page=paginator.page(5)#取到第x页,返回一个Page对象
#         print(current_page.object_list)#取当前页码所有数据
#         print(current_page.has_next())#是否有下一页
#         print(current_page.has_previous())#是否有上一页
#         print(current_page.next_page_number())#下一页页码数
#         print(current_page.previous_page_number())#上一页页码数
#         return render(request,'booklist.html',locals())

# def booklist(request):
#     from django.core.paginator import Paginator
#     books=models.Book.objects.all()
#     paginator=Paginator(books,3)
#     try:
#         current_page_num=int(request.GET.get('page'))
#         current_page=paginator.page(current_page_num)
#         # for item in current_page:#既可以循环current_page,又可以循环当前页的对象current_page.object_list
#         #     print(item)#拿到前端去用
#     except EmptyPage as e:
#         #捕获异常后调到第一页
#         current_page_num=1
#         current_page=paginator.page(current_page_num)
#     except Exception as e:
#         current_page_num = 1
#         current_page = paginator.page(current_page_num)
#     return render(request,'booklist.html',locals())
def booklist(request):
    book_list = models.Book.objects.get_queryset().order_by('id')#当分页提示报警时,可以order by id一下
    paginator = Paginator(book_list, 3)
    # 如果页码数多,让它显示前5,后5,中间是当前在的页
    try:
        current_page_num = int(request.GET.get('page'))
        current_page = paginator.page(current_page_num)
        if paginator.num_pages > 11:
            if current_page_num - 5 < 1:
                page_range = range(1, 12)
            elif current_page_num + 5 > paginator.num_pages:
                page_range = range(paginator.num_pages - 11, paginator.num_pages)
            else:
                page_range = range(current_page_num - 5, current_page_num + 5)
        else:
            page_range = paginator.page_range
    except Exception as e:
        current_page_num = 1
        current_page = paginator.page(current_page_num)
    return render(request, 'booklist.html', locals())
View Code

 range是前闭后开区间,range(1,11)表示[0,11)之间的所有整数.注意分页要分成一个range区间,range别忘记写上

page_range=range(1,current_page_num+5)

注意request获取到的页码是字符串,要转成int类型

current_page_num = request.GET.get('page')
current_page_num=int(current_page_num)

 4.bootstrap样式

class="disabled"元素一律点击无效

转载于:https://www.cnblogs.com/xufengnian/p/10022988.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值