Django ajax异步请求分页的实现

Django中有一个自带的Paginator分页器,用起来很方便的在原生的模板中进行调用函数分页;

可是每次点击换页都会重新载入页面,原来是原生分页器依靠的是A标签的GET请求实现的,这就要用ajax异步请求来解决这个尴尬的情况,(有时同一页面会有多个不同的分类需要添加分页器的场景等),但是ajax回调时接收的是json,而json不能给模板传入对象,该怎么分页呢?

1、就将分页需要用到的数据从对象中提前取出来,放在字典里面

2、前台调用时候不再从对象中取,而是字典中取,完成分页样式; 

我把一个我自己写的代码附上,一看就明白了。(没做修改,HTML代码部分凌乱一些。。)

HTML部分:

 {#分页开始#}
                <div aria-label="Page navigation">
                    <ul class="pagination">
                        {% if page_previous %}
                            <li value="{{ page_previous }}"><a href="javascript:void(0);" aria-label="Previous"><span
                                    aria-hidden="true">上一页</span></a></li>
                        {% else %}
                            <li value="{{ page_previous }}" class="disabled"><a href="javascript:void(0);" aria-label="Previous"><span
                                    aria-hidden="true">上一页</span></a></li>
                        {% endif %}
                        {% for page_nums in current_range %}
                            {% if current_page_num == page_nums %}
                                <li value="{{ page_nums }}" class="active"><a href="javascript:void(0);">{{ page_nums }}</a></li>
                            {% else %}
                                <li value="{{ page_nums }}"><a href="javascript:void(0);">{{ page_nums }}</a></li>
                            {% endif %}
                        {% endfor %}
                        {% if page_next %}
                            <li value="{{ page_next }}"><a href="javascript:void(0);" aria-label="Next"><span
                                    aria-hidden="true">下一页</span></a></li>
                        {% else %}
                            <li value="{{ page_next }}" class="disabled"><a href="javascript:void(0);" aria-label="Next"><span
                                    aria-hidden="true">下一页</span></a>
                            </li>
                        {% endif %}
                    </ul>
                </div>

代码部分(自定义函数,也可直接在views.py中):

from django.core.paginator import Paginator, EmptyPage

def pages(request, format_title_list, row_num):
    paginator = Paginator(format_title_list, row_num)  # 使用Paginator方法得到paginator对象

    ###### paginator对象的方法 #########
    # print(paginator.count)         #显示所有数据条数
    # print(paginator.page_range)    #分页器的页数范围
    # print(paginator.num_pages)     #分液器总页数

    current_page_num = int(request.GET.get(‘page‘, 1))  # 获得请求的页数,默认值为1,当GET没有值时显示第一页的内容。
    # 以下是页面显示效果:,当页数大于11页数时,将显示当前页的前5页和后5页的页码,如果选择的页码小于5时,显示的页码为1至11页,如果页码加5大于最大页码数时,显示最后11页的页码。    如果总页数小于11页时就正常显示页码。
    if paginator.num_pages > 11:
        if current_page_num - 5 < 1:  # 当前页-5如果小于1的话,说明页码已经是小于5的,那么页码范围就显示前11页数。
            # 这里也可以写成 if current_page_num < 6 。这样显得更容易理解。
            current_range = range(1, 11)
        elif current_page_num + 5 > paginator.num_pages:  # 当前页码+5大于最大页码时,说明已经到达最后的5页了。那么页码范围就显示后11页数。
            # 这里也可以写成 elif current_page_num > paginator.num_pages-5 。容易理解。
            current_range = range(paginator.num_pages - 10, paginator.num_pages + 1)
        else:
            current_range = range(current_page_num - 5, current_page_num + 6)  # 显示当前页的前五和后五页码数。
    else:
        current_range = paginator.page_range  # 否则正常显示页码数。
    try:
        current_page = paginator.page(current_page_num)  # 当页码超出范围时,会抛出异常。
        # page1 = paginator.page(1)
        # print(page1.object_list)
        # for i in page1:
        #     print(i)
    except EmptyPage as e:  # 异常的解决方案为当前页码内容显示为第一页。
        current_page = paginator.page(1)

    page_previous = current_page.previous_page_number() if current_page.has_previous() else 0  #得到上一页
    page_next = current_page.next_page_number() if current_page.has_next() else 0  #得到下一页
    current_range = list(current_range)  #当前页码范围
    current_page = list(current_page)  #当前页内容(文章标题)
    return {‘current_range‘: current_range, ‘current_page‘: current_page, ‘current_page_num‘: current_page_num,
            ‘page_previous‘: page_previous, ‘page_next‘: page_next}

views.py中

def workingpaper(request):
    #上面代码全部省略
        article_list = Article.objects.all().order_by(‘-pk‘)  #获得所有文件queryset对象列表
        article_format_title = formattitle.format_title(article_list, 43)  #自定义方法,用来格式化标题在渲染页面时的长度统一。(在我的博客里有这部分源码)
        ret_page = mypaginator.pages(request, article_format_title, 10)   #自定义方法,分页器方法的调用。
    return render(request, ‘workingpaper.html‘, {‘current_range‘: ret_page[‘current_range‘],
                                                 ‘current_page‘: ret_page[‘current_page‘],
                                                 ‘current_page_num‘: ret_page[‘current_page_num‘],
                                                 ‘page_previous‘: ret_page[‘page_previous‘],
                                                 ‘page_next‘: ret_page[‘page_next‘]})

jquery部分

function paginator(data) {
    $(‘.pagination li‘).remove();

    if (data[‘page_previous‘]) {
        $(‘.pagination‘).append("<li value=‘" + data[‘page_previous‘] + "‘><a href=‘javascript:void(0);‘ aria-label=‘Previous‘><span aria-hidden=‘true‘>上一页</span></a></li>")
    } else {
        $(‘.pagination‘).append("<li value=‘" + data[‘page_previous‘] + "‘ class=‘disabled‘><a href=‘javascript:void(0);‘ aria-label=‘Previous‘><span aria-hidden=‘true‘>上一页</span></a></li>")
    }
    for (var k in  data[‘current_range‘]) {
        if (data[‘current_page_num‘] == data[‘current_range‘][k]) {
            $(‘.pagination‘).append(‘<li value="‘ + data[‘current_range‘][k] + ‘" class="active"><a href="javascript:void(0);">‘ + data["current_range"][k] + ‘</a></li>‘)
        } else {
            $(‘.pagination‘).append(‘<li value="‘ + data[‘current_range‘][k] + ‘"><a href="javascript:void(0);">‘ + data["current_range"][k] + ‘</a></li>‘)
        }
    }
    if (data[‘page_next‘]) {
        $(‘.pagination‘).append("<li value=‘" + data[‘page_next‘] + "‘><a href=‘javascript:void(0);‘ aria-label=‘Previous‘><span aria-hidden=‘true‘>下一页</span></a></li>")
    } else {
        $(‘.pagination‘).append("<li value=‘" + data[‘page_next‘] + "‘ class=‘disabled‘><a href=‘javascript:void(0);‘ aria-label=‘Previous‘><span aria-hidden=‘true‘>下一页</span></a></li>")
    }
}

function set_li(data) {
    $(‘.ul-list li‘).remove();
    for (var i = 0; i < data[‘current_page‘].length; i++) {
        $(‘.ul-list‘).append("<li value=" + data[‘current_page‘][i].nid + "><a herf=‘javascript:void(0);‘><span class=‘glyphicon glyphicon-menu-right‘></span>" +
            data[‘current_page‘][i].title + "</a></li>");
    }
}

var class_mark = ‘page‘; //用于做翻页器的类别标识
var class_field = ‘‘;  //用于传递类别中的具体筛选条件
$(‘.pagination‘).on(‘click‘, ‘li‘, function () {
    console.log(class_mark);
    $.ajax({
        url: ‘‘,
        type: ‘get‘,
        data: {
            page: $(this).val(),
            class_name: class_mark,
            id: class_field,
            retdate: class_field,
        },
        success: function (data) {
            set_li(data);
            paginator(data)
        }
    })
});

$(‘.ul-list‘).on(‘click‘, ‘a‘, function () {
    var num = $(‘.ul-list li‘).val();
    location.href = "/text/" + num
});

$(‘.showalldptlist‘).click(function () {
    class_mark = ‘page‘;
    class_field = $(this).val();
    $.ajax({
        url: "",
        type: ‘get‘,
        data: {
            page: $(this).val(),
            class_name: ‘page‘,
        },
        success: function (data) {
            set_li(data);
            paginator(data);
        }
    })
});

效果图:

原文地址:https://www.cnblogs.com/sly27/p/10516184.html

时间: 2024-08-02 22:27:20

Django ajax异步请求分页的实现的相关文章

ajax异步请求分页显示

html代码: <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title></title>     <script src='__PUBLIC__/jquery-3.0.0.min.js'></script> </head> <body>     &l

Ajax 异步局部刷新

Ajax 异步局部刷新 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 实现json 字符串与 JavaScrip 对象得相互转换 JSON.parse()和 JSON.stringify() 1.序列化(将JavaScrip 转换为 json)使用 JSON.st

jQuery ajax 异步请求

jQuery - AJAX 简介 AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新. 什么是 AJAX? AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML). 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示. 关于 jQuery 与 AJAX jQuery 提供多个与 AJAX 有关的方法. 通过 jQuery AJAX 方法,您能够使用 HTTP Get

Java项目(1)——采用Ajax异步交互技术验证用户代码是否重复

DRP项目中涉及到注册用户的问题.本文讲述的是注册过程中使用Ajax异步交互验证用户名是否已经存在的实现原理.之前很多项目中并未使用Ajax技术,结果是所有的判断都等到点击提交按钮时再执行,这样的结果无非是网站卡/软件死,都说不作死就不会死,所以Ajax被广泛应用,用户竖起拇指称赞,不得不说Ajax俘虏了web用户啊~~ 实现之前先了解下AjaxreadyState的五个状态. 因本人越来越倾向于英文原版,觉得从它的本源探索会更直接更容易理解,所以在下面使用了英文解释,后面是自己的理解. 0:

ajax 异步请求四个步骤

ajax异步请求详解 ajxa定义:异步的JavaScript和xml 1.XMLHttpRequst的出现才有了异步处理 2.创建XmlHttpRequest对象 var request=new XMLHttpRequest(); 注意:如果要兼容IE6以下浏览器则需要编写如下代码 var request; if(window.XMLRequest){ request=new XMLRequestHttpRequest();  //IE7.IE8.360等 }else{ request=new

Django &amp; Ajax Part01

背景需求分析 使用Django+Ajax的背景情景,当用户填写一个非常详细的注册申请表的时候!用户最担心的事情应该是填表期间被人打扰,其次是希望填完表提交以后千万别出现什么差错,否则又得从新来过!因此,我们首先想到的可能会是使用Ajax来处理.Ajax的介绍通常都是基于PHP后台的编写模式,我自己从没用过PHP写过服务器,所以找工作对我来说都是一场噩梦啊! 开发环境准备 这里我将会完整的演示如何建立以及配置我们的django环境,以后我们写的各种代码如果不特别说明都是基于这个项目环境上完成的!

触碰jQuery:AJAX异步详解

触碰jQuery:AJAX异步详解 传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它并非一种新的技术,而是以下几种原有技术的结合体. 1)   使用CSS和XHTML来表示. 2)   使用DOM模型来交互和动态显示. 3)   使用XMLHttpRequest来和服务器进行异步通信. 4)   使用javascript来绑定和调用.

[Ajax] 使用Ajax异步上传图片文件(非Form表单提交)

通过表单Form提交来上传文件的方式这里就不说了: 下面介绍,通过js中使用ajax异步上传图片文件: 新建一个html页面和一个一般处理程序即可: 涉及思路: //发送2次Ajax请求完成js异步上传文件的操作:          //第1次,post 只上传文件,返回文件名name          //第2次,get 根据文件名name定位服务器上的文件,同时根据浏览器传过来的realname重命名服务器上的文件          //(如果有其他参数,也可以通过第2次一并上传) 图片文件

ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也没什么大的差别. 在ASP.NET应用程序里使用ASP.NET AJAX访问WebService通常都是通过ScriptMananger引入WebService生成客户端代理的方法,同时也可以使用Microsoft Ajax Library来完成.本文将介绍在ASP.NET MVC中使用ASP.NE