zoukankan      html  css  js  c++  java
  • Django如何在views视图中做分页

    场景模拟

    class Teacher(models.Model):
        name = models.CharField(max_length=32)
    
    
    class UserInfo(models.Model):
        username = models.CharField(max_length=32)
        QQ = models.CharField(max_length=16)
        class_name = models.CharField(max_length=32)
        c_time = models.DateTimeField(auto_now_add=True)
        status = models.IntegerField()
        teacher = models.ForeignKey(Teacher)
    

    1.urls.py

    url(r'^index/', views.index),
    

    2.views.py

    def page_list_return(total, current=1):
        """
        page
        分页,返回本次分页的最小页数到最大页数列表
        """
        min_page = current - 2 if current - 4 > 0 else 1
        max_page = min_page + 4 if min_page + 4 < total else total
    
        return range(min_page, max_page + 1)
    
    
    def pages(post_objects, request):
        """
        分页公用函数,返回分页的对象元组
        """
        paginator = Paginator(post_objects, 3)
        try:
            current_page = int(request.GET.get('page', '1'))
        except ValueError:
            current_page = 1
    
        page_range = page_list_return(len(paginator.page_range), current_page)
    
        try:
            page_objects = paginator.page(current_page)
        except (EmptyPage, InvalidPage):
            page_objects = paginator.page(paginator.num_pages)
    
        if current_page >= 5:
            show_first = 1
        else:
            show_first = 0
    
        if current_page <= (len(paginator.page_range) - 3):
            show_end = 1
        else:
            show_end = 0
    
            # 所有对象,分页器,本页对象,所有页码,本页页码,是否显示第一页,是否显示最后一页
        return post_objects, paginator, page_objects, page_range, current_page, show_first, show_end
    
    
    def index(request):
        '''
    
        :param request:
        :return:
        '''
        if request.method == "GET":
            queryset = models.UserInfo.objects.all().order_by('id')
            post_objects, paginator, page_objects, page_range, current_page, show_first, show_end = pages(queryset, request)
            return render(request, 'index.html', locals())
    

    实现

    • index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="/static/bootstrap.min.css">
        <title>Title</title>
        <style>
            .ibox-content {
                background-color: #ffffff;
                color: inherit;
                padding: 15px 20px 20px 20px;
                border-color: #e7eaec;
                border-image: none;
                border-style: solid solid none;
                border- 1px 0;
            }
        </style>
    </head>
    <body>
    <div class="wrapper">
        <div class="row">
            <div class="col-sm-12">
                <div class="ibox float-e-margins">
                    <div class="ibox-title">
                        <h5> 概览 </h5>
                    </div>
                    <div class="ibox-content" >
                        <div class="">
                            <a class="btn btn-sm btn-primary add_vendor"> 添加 </a>
                            <a class="btn btn-sm btn-warning "> 添加 </a>
                            <form id="search_form" method="get" action="" class="pull-right mail-search">
                            </form>
                        </div>
                        <table class="table table-striped table-bordered table-hover " id="editable" style="margin-top: 10px">
                            <thead>
                            <tr>
                                <th class="text-center">序号</th>
                                <th class="text-center">姓名</th>
                                <th class="text-center">QQ号码</th>
                                <th class="text-center">班级</th>
                                <th class="text-center">时间</th>
                                <th class="text-center">状态</th>
                                <th class="text-center">班主任</th>
                                <th class="text-center">操作</th>
                            </tr>
                            </thead>
                            <tbody>
                            {% for item in page_objects %}
                                <tr class="gradeX">
                                    <td style="display: none">{{ item.map_id }}</td>
                                    <td>{{ forloop.counter }}</td>
                                    <td>{{ item.username }}</td>
                                    <td>{{ item.QQ }}</td>
                                    <td>{{ item.class_name }}</td>
                                    <td>{{ item.c_time|date:"Y-m-d" }}</td>
                                    <td>{{ item.status }}</td>
                                    <td>{{ item.teacher.name }}</td>
    
                                    <td class="text-center">
                                        <a href="" class="btn btn-xs btn-info">编辑</a>
                                        <button type="button" class="btn btn-xs btn-danger del_item">删除</button>
                                    </td>
                                </tr>
                            {% endfor %}
                            </tbody>
                        </table>
                        <div class="row">
                            <div class="col-sm-6">
                                <div class="dataTables_info" id="editable_info" role="status" aria-live="polite">
                                    第 {{ page_objects.start_index }} ~ {{ page_objects.end_index }}条 |
                                    总 {{ paginator.count }} 条
                                </div>
                            </div>
                            {% include 'pagintor.html' %}
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </body>
    </html>
    
    • pagintor.html
    <div class="col-sm-6">
        <div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
            <ul class="pagination" style="margin-top: 0; float: right">
                {% if page_objects.has_previous %}
                    <li class="paginate_button previous" aria-controls="editable" tabindex="0" id="editable_previous">
                        <a class="page" href="?page={{ page_objects.previous_page_number }}">Previous</a>
                    </li>
                {% else %}
                    <li class="paginate_button previous disabled" aria-controls="editable" tabindex="0" id="editable_previous">
                         <a class="page" href="#">Previous</a>
                    </li>
                {% endif %}
                {% ifequal show_first 1 %}
                    <li class="paginate_button" aria-controls="editable" tabindex="0"><a class="page" href="?page=1"  title="第1页">1...</a></li>
                {% endifequal %}
                {% for page in page_range %}
                    {% ifequal current_page page %}
                        <li class="paginate_button active"  aria-controls="editable" tabindex="0"><a class="page" href="?page={{ page }}"  title="第{{ page }}页">{{ page }}</a></li>
                    {% else %}
                        <li class="paginate_button" aria-controls="editable" tabindex="0"><a class="page" href="?page={{ page }}"  title="第{{ page }}页">{{ page }}</a></li>
                    {% endifequal %}
                {% endfor %}
                {% ifequal show_end 1 %}
                    <li class="paginate_button" aria-controls="editable" tabindex="0"><a class="page" href="?page={{ p.num_pages }}"  title="第{{ page }}页">...{{ p.num_pages }}</a></li>
                {% endifequal %}
                {% if page_objects.has_next %}
                    <li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
                        <a class="page" href="?page={{ page_objects.next_page_number }}">Next</a>
                    </li>
                {% else %}
                    <li class="paginate_button next disabled" aria-controls="editable" tabindex="0" id="editable_next">
                        <a class="page" href="#">Next</a>
                    </li>
                {% endif %}
            </ul>
        </div>
    </div>
    

    效果

    语法举例

    import os
     
    from django.core.paginator import Paginator
    objects = ['john','paul','george','ringo','lucy','meiry','checy','wind','flow','rain']<br>
    p = Paginator(objects,3)  # 3条数据为一页,实例化分页对象
    print p.count  # 10 对象总共10个元素
    print p.num_pages  # 4 对象可分4页
    print p.page_range  # xrange(1, 5) 对象页的可迭代范围
     
    page1 = p.page(1)  # 取对象的第一分页对象
    print page1.object_list  # 第一分页对象的元素列表['john', 'paul', 'george']
    print page1.number  # 第一分页对象的当前页值 1
     
    page2 = p.page(2)  # 取对象的第二分页对象
    print page2.object_list  # 第二分页对象的元素列表 ['ringo', 'lucy', 'meiry']
    print page2.number  # 第二分页对象的当前页码值 2
     
    print page1.has_previous()  # 第一分页对象是否有前一页 False
    print page1.has_other_pages()  # 第一分页对象是否有其它页 True
     
    print page2.has_previous()  # 第二分页对象是否有前一页 True
    print page2.has_next()  # 第二分页对象是否有下一页 True
    print page2.next_page_number()  # 第二分页对象下一页码的值 3
    print page2.previous_page_number()  # 第二分页对象的上一页码值 1
    print page2.start_index()  # 第二分页对象的元素开始索引 4
    print page2.end_index()  # 第2分页对象的元素结束索引 6
    
    
  • 相关阅读:
    Linux的chattr与lsattr命令详解
    linux mutt邮件发送配置
    linux查看杀死进程
    linux邮件配置
    八-----函数探幽
    一至七-----小东西
    350. Intersection of Two Arrays II
    349. Intersection of Two Arrays
    345. Reverse Vowels of a String
    反转字符串
  • 原文地址:https://www.cnblogs.com/forsaken627/p/12521973.html
Copyright © 2011-2022 走看看