Django+Paginator+ajax动态加载分页

橙三吉。 提交于 2020-02-26 06:23:18

Django+Paginator+ajax动态加载分页

django轻量级分页模块Paginator,怎么做到切换页面而不刷新整个页面呢?

其实实现起来很简单,思路:Paginator后端拆分好(如:共多少页;当前第几页;这一页的内容是什么?),通过Ajax交互数据展示。

Paginator两个核心对象介绍(Paginator, page)

Paginator

  • per_page: 每页显示记录数量
  • count:数据总个数
  • num_pages:总页数
  • page_range:总页数的索引范围,如: (1,10),(1,200)
  • page:page对象 page(2) 代表第二页数据的对象

Page

  • has_next:是否有下一页
  • has_previous:是否有上一页
  • next_page_number:下一页页码
  • previous_page_number:上一页页码
  • object_list:分页之后的当前页数据列表
  • number:当前页
  • paginator:paginator对象,父类对象

贴代码,希望能和大家一起学习交流。

urls.py

from app import views

urlpatterns = [
    path('console/', views.console, name='console'),
]

views.py

from django.http import JsonResponse
from django.core.paginator import Paginator, PageNotAnInteger, InvalidPage
from 
# 我这里的'user'为调用models的展示的数据

def console(request):
	# 所有数据
    user_list = User.objects.all()
    # 分页功能,一页7条数据
    paginator = Paginator(user_list, 7)
    if request.method == 'GET':
    	# 默认显示第一页的数据
    	users = paginator.page(1)
    	return render(request, 'system/console.html', {'users': users})
   	# Ajax数据交互
    if request.is_ajax():
        page = request.GET.get('page')
        try:
            users = paginator.page(page)
        # 如果页数不是整数,返回第一页
        except PageNotAnInteger:
            users = paginator.page(1)
        # 如果页数不存在/不合法,返回最后一页
        except InvalidPage:
            users = paginator.page(paginator.num_pages)
        user_li = list(users.object_list.values())
        # 分别为是否有上一页false/true,是否有下一页false/true,总共多少页,当前页面的数据
        result = {'has_previous': users.has_previous(),
                  'has_next': users.has_next(),
                  'num_pages': users.paginator.num_pages,
                  'user_li': user_li}
        return JsonResponse(result)

console.html

样式用到的是国产框架类UI(layui),用到内容:静态表格,按钮样式 layui传送门

<link rel="stylesheet" href={% static 'layui/css/layui.css' %}>
<table class="layui-table">
    <thead>
    <tr>
        <th>用户</th>
        <th>身份</th>
        <th>性别</th>
        <th>电话</th>
        <th>邮箱</th>
        <th>最近登录</th>
        <th>加入时间</th>
        <th>更新时间</th>
    </tr>
    </thead>
    <tbody id="tbody"></tbody>
</table>
<div style="text-align: center;margin: 5% 0;">
    <form id="page" action={% url 'console' %}>
        <a class="first_page">
            <button type="button" class="layui-btn layui-btn-primary layui-btn-sm">上一页</button>
        </a>
		
		// 页数便利出来
        {% for num in users.paginator.page_range %}
            <a class="now_page">
                <button type="button" class="layui-btn layui-btn-primary layui-btn-sm">{{ num }}</button>
            </a>
        {% endfor %}

        <button id="num_pages" type="button" class="layui-btn layui-btn-primary layui-btn-sm">
            共{{ users.paginator.num_pages }}页
        </button>

        <a class="last_page">
            <button type="button" class="layui-btn layui-btn-primary layui-btn-sm">下一页</button>
        </a>
    </form>
</div>

ajax部分

工具jQuery3.4.1 jQuery传送门

<script>
    $(function () {
        // ajax分页
		// 打开页面加载第一页
        let now_page = 1;
		page_click()
        $('.first_page button').removeClass('layui-btn-primary').addClass('layui-btn-disabled');
        $('.now_page button').first().removeClass('layui-btn-primary').addClass('page_this');
        //上一页
        $('.first_page').click(function () {
            now_page -= 1;
            if (now_page < 1) {
                now_page = 1;
                return false
            } else {
                $('.page_this').parent().prev().click();
            }
        });
        //下一页
        $('.last_page').click(function () {
            let num_pages = $('.now_page button').last().text();
            now_page += 1;
            if (now_page > parseInt(num_pages)) {
                now_page -= 1;
                return false
            } else {
                $('.page_this').parent().next().click();
            }
        });
        //切换页
        $('.now_page').click(function () {
            now_page = parseInt($(this).children('button').text());
            $('.now_page button').removeClass('page_this').addClass('layui-btn-primary');
            $(this).addClass('page_this');
            $(this).children('button').removeClass('layui-btn-primary').addClass('page_this');
            page_click()
        });

        function page_click() {
            let page_form = $('#page');
            $.ajax({
                type: 'get',
                url: page_form.attr('action'),
                data: {page: now_page},
                success: function (data) {
                    $('#tbody tr').remove();
                    $('#num_pages').html('共' + data.num_pages + '页');
                    if (data.has_previous === true) {
                        $('.first_page button').removeClass('layui-btn-disabled').addClass('layui-btn-primary');
                    } else {
                        $('.first_page button').removeClass('layui-btn-primary').addClass('layui-btn-disabled')
                    }
                    if (data.has_next === true) {
                        $('.last_page button').removeClass('layui-btn-disabled').addClass('layui-btn-primary');
                    } else {
                        $('.last_page button').removeClass('layui-btn-primary').addClass('layui-btn-disabled');
                    }
                    $.each(data.user_li, function (index, user) {
                        let a = '<td>';
                        let b = '</td>';
                        let body = a + user.username + b + a + user.is_rank + b + a + user.sex + b + a + user.phone + b + a + user.email + b + a + user.last_login + b + a + user.date_joined + b + a + user.update_time + b;
                        $('#tbody').append('<tr>' + body + '</tr>');
                    });
                }
            })
        }
    })
</script>

效果图 效果图

或许还有更加高级的方法,这只是其中方法的一种,希望能和大家一起交流分享学习。

打赏

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!