Django | 批量数据和分页展示

138 阅读2分钟

批量插入

原理:

1. 先批量创建数据
2. 再将所有的数据展示到前端

方法一:每循环一次,创建一个数据

def index(request):  
    # 先批量生成1000条数据  
    for i in range(1000):  
    models.DAY09.objects.create(title='No.%sBOOK'%i)  
  
    # 再将所有数据查询并展示到前端页面  
    book_queryset = models.DAY09.objects.all()  
  
    return render(request, 'index.html', locals())

方法二:循环创建数据,添加进表格,用.bulk方法直接在表里创建数据

def index(request):
    book_list = []
    for i in range(100000):
        book_obj = models.DAY09(title='No.%sBOOK'%i)
        book_list.append(book_obj)
    
    model.DAY09.objects.bulk_create(book_list)
    book_queryset = models.DAY09.objects.all()
    
    return render(request, 'index.html', locals())

注意:.bulk_create()是封装好的方法,效率非常快。推荐!

分页器

接着上面已经批量创建好的数据,我们先删除PK值大于1000的,这样方便我们操作

models.DAY09.objects.filter(pk__gt=1000).delete()

推导分页原理

规律

'''  
page_per_num = 10  
  
current_page | start_page | end_page  
1 0 10  
2 10 20  
3 20 30  
4 30 40  
  
  
page_per_num = 5  
  
current_page | start_page | end_page  
1 0 5  
2 5 10  
3 10 15  
4 15 20  
  
(current_page - 1) * page_per_num = start_page  
current_page * page_per_num = end_page  

'''

代码原理:

def index(request):
    # 分页  
    book_queryset = models.DAY09.objects.all()  

    # 想访问哪一页数据  
    current_page = request.GET.get('page', 1) # 如果获取不到当前页码,默认展示第一页  

    # 数据类型转换  
    try:  
        current_page = int(current_page)  
    except Exception:  
        current_page = 1  

    # 每页展示多少条数据  
    page_per_num = 10  

    # 起始位置  
    start_page = (current_page - 1) * page_per_num  

    # 终止位置  
    end_page = current_page * page_per_num  

    # 分页  
    book_queryset = models.DAY09.objects.all()[start_page : end_page]  

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

变成自动化分页,加渲染界面,动态

再页码制作个数时候,一般情况下都是奇数,符合中国人审美上的对称

def index(request):  
    # 分页  
    book_list = models.DAY09.objects.all()  
  
    # 想访问哪一页数据  
    current_page = request.GET.get('page', 1) # 如果获取不到当前页码,默认展示第一页  
  
    # 数据类型转换  
    try:  
    current_page = int(current_page)  
    except Exception:  
    current_page = 1  

    # 每页展示多少条数据  
    page_per_num = 10  

    # 起始位置  
    start_page = (current_page - 1) * page_per_num  

    # 终止位置  
    end_page = current_page * page_per_num  

    # 计算出到底需要多少页  
    all_count = book_list.count()  
    page_count, more = divmod(all_count, page_per_num)  
    if more:  
    page_count += 1  

    page_html = ''  
    xxx = current_page  
    if current_page < 6:  
    current_page = 6  
    for i in range(current_page - 5, current_page + 6):  
    if xxx == i:  
    page_html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)  
    else:  
    page_html += '<li><a href="?page=%s">%s</a></li>' % (i, i)  
    # 分页  
    book_queryset = book_list[start_page : end_page]  

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

views.py

<body>  
{% for foo in book_queryset %}  
    <p>{{ foo.title }}</p>  
{% endfor %}  
  
<nav aria-label="Page navigation">  
    <ul class="pagination">  
        <li>  
            <a href="#" aria-label="Previous">  
            <span aria-hidden="true">&laquo;</span>  
            </a>  
        </li>  
        {{ page_html|safe }}  
        <li>  
            <a href="#" aria-label="Next">  
            <span aria-hidden="true">&raquo;</span>  
            </a>  
        </li>  
    </ul>  
</nav>  
  
</body>