Django高级之分页器组件

批量插入数据

模板层models.py

from django.db import models

class Books(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    publish = models.CharField(max_length=32)

数据库迁移

python3 manage.py makemigrations

python3 manage.py migrate

路由层urls.py

urlpatterns = [
    url(r'^books_page/', views.books_page), 
]

视图层views.py

# 往Book表里批量插入数据

def books_page(request):
   # 第一种方案,每循环一次,操作一下数据库,性能低(相当于进行了1000次的数据库链接)
    # for i in range(1000):
    #     book=models.Books.objects.create(name='图书%s'%i,price=i+10,publish='东京出版社')
    #
   # 第二种方案,批量插入
    book_list=[]  # 实例化对象放到列表里
    for i in range(1000):
        book=models.Books(name='图书%s'%i,price=i+10,publish='东京出版社')
        book_list.append(book)
    # bulk_create一次性插入,batch_size分批往里面插
    models.Books.objects.bulk_create(book_list,batch_size=100)

    return HttpResponse('ok')

# 当你想要批量插入数据的时候,使用ORM提供的 bulk_create 能够大大的减少操作时间

Django分页器

分页方法

from django.core.paginator import Paginator
def books_page(request):
    book_list=models.Books.objects.all()
    paginator=Paginator(book_list,10)
    # Paginator对象的属性
    print(paginator.count) # 数据总条数
    print(paginator.num_pages) # 总页数
    print(paginator.per_page) # 每页显示条数
    print(paginator.page_range) # range(1, 101)
    print(paginator.page(1))
    # Page对象的属性和方法
    # has_next              是否有下一页
    # next_page_number      下一页页码
    # has_previous          是否有上一页
    # previous_page_number  上一页页码
    # object_list           分页之后的数据列表
    # number                当前页
    page=paginator.page(2)
    print(page.has_next())
    print(page.next_page_number())
    print(page.has_previous())
    print(page.previous_page_number())
    print(page.object_list)
    print(page.number)

    return render(request,'book_page.html',locals())

分页器终极用法

分页
-django提供的两个类
-Paginator类
-Pager类

后端

def books_page(request):
    current_num = int(request.GET.get('page_num', 1))
    book_list = models.Books.objects.all()

    paginator = Paginator(book_list, 20)
    try:
        page = paginator.page(current_num)
    except Exception as e:
        current_num = 1
        page = paginator.page(current_num)

    if paginator.num_pages > 11:
        if current_num - 5 < 1:
            page_range = range(1, 12)
        elif current_num + 5 > paginator.num_pages:
            page_range = range(paginator.num_pages - 10, paginator.num_pages + 1)
        else:
            page_range = range(current_num - 5, current_num + 6)
    else:
        page_range = paginator.page_range

    return render(request, 'book_page.html', locals())

前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
    <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    <script src="/static/jquery-3.3.1.js"></script>
</head>
<body>
<div class="container-fluid">
    <div class="row">

        <div class="col-md-8 col-md-offset-2">
            <div class="panel panel-success">
                <div class="panel-heading">
                    <h3 class="panel-title">图书列表展示</h3>
                </div>
                <div class="panel-body">

                    <table class="table table-striped">
                        <thead>
                        <tr>
                            <th>id</th>
                            <th>书名</th>
                            <th>价格</th>
                            <th>出版社</th>
                        </tr>
                        </thead>
                        <tbody>
                        {% for book in page.object_list %}
                            <tr>
                                <td>{{ book.id }}</td>
                                <td>{{ book.name }}</td>
                                <td>{{ book.price }}</td>
                                <td>{{ book.publish }}</td>
                            </tr>
                        {% endfor %}
                        </tbody>
                    </table>
                    <div class="text-center">
                        <nav aria-label="Page navigation">
                            <ul class="pagination">
                                {% if page.has_previous %}
                                    <li>
                                        <a href="/books_page/?page_num={{ page.previous_page_number }}"
                                           aria-label="Previous">
                                            <span aria-hidden="true">&laquo;</span>
                                        </a>
                                    </li>
                                {% else %}
                                    <li class="disabled">
                                        <a href="" aria-label="Previous">
                                            <span aria-hidden="true">&laquo;</span>
                                        </a>
                                    </li>
                                {% endif %}
                                {% for foo in page_range %}
                                    {% if current_num == foo %}
                                        <li class="active"><a href="/books_page/?page_num={{ foo }}">{{ foo }}</a></li>
                                    {% else %}
                                        <li><a href="/books_page/?page_num={{ foo }}">{{ foo }}</a></li>
                                    {% endif %}
                                {% endfor %}
                                {% if page.has_next %}
                                    <li>
                                        <a href="/books_page/?page_num={{ page.next_page_number }}" aria-label="Next">
                                            <span aria-hidden="true">&raquo;</span>
                                        </a>
                                    </li>
                                {% else %}
                                    <li class="disabled">
                                        <a href="" aria-label="Next">
                                            <span aria-hidden="true">&raquo;</span>
                                        </a>
                                    </li>
                                {% endif %}
                            </ul>
                        </nav>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>
posted @ 2021-12-03 16:03  沈忻凯  阅读(52)  评论(0)    收藏  举报