Django提供了数据分页的类,这些类被定义在django/core/paginator.py中。 类Paginator用于对列进行一页n条数据的分页运算。类Page用于表示第m页的数据。需要导入:

from django.core.paginator import Paginator


Paginator类实例对象

  • 方法__init__(列表,int):返回分页对象,第一个参数为列表数据,第二个参数为每页数据的条数。

    paginator = Paginator(areas, 10) #按每页10条数据进行分页
  • 属性count:返回对象总数。

    print("========总条目========")
    print(paginator.count)
  • 属性num_pages:返回页面总数。

    print("========总页数========")
    print(paginator.num_pages)
  • 属性page_range:返回页码列表,从1开始,例如[1, 2, 3, 4]。

    print("========页码集合========")
    print(paginator.page_range)
  • 方法page(m):返回Page类实例对象,表示第m页的数据,下标以1开始。

    areainfo_page = paginator.page(pageindex) # 得到第pageindex页的数据


Page类实例对象

  • 属性object_list:返回当前页对象的列表。

    print("========属性object_list:返回当前页对象的列表========")
    print(areainfo_page.object_list)
  • 属性number:返回当前是第几页,从1开始。

    print("========属性number:返回当前是第几页,从1开始========")
    print(areainfo_page.number)
  • 属性paginator:当前页对应的Paginator对象。

    print("========属性paginator:当前页对应的Paginator对象========")
    print(areainfo_page.paginator)
  • 方法has_next():如果有下一页返回True。

    print("========方法has_next():如果有下一页返回True========")
    print(areainfo_page.has_next())
  • 方法has_previous():如果有上一页返回True。

    print("========方法has_previous():如果有上一页返回True。======")
    print(areainfo_page.has_previous())
  • previous_page_number:返回前一页的页码

    print("========previous_page_number:返回前一页的页码========")
    print(areainfo_page.previous_page_number())
  • next_page_number:返回下一页的页码

    print("========next_page_number:返回下一页的页码。======")
    print(areainfo_page.next_page_number())


打印结果:

========总条目========
33
========返回页面总数========
4
========返回页码列表,从1开始,例如[1, 234]========
range(1, 5)
========返回Page类实例对象,表示第m页的数据,下标以1开始========
========属性object_list:返回当前页对象的列表========
<QuerySet [<AreaInfo: AreaInfo object (110000)>, <AreaInfo: AreaInfo object (120000)>, <AreaInfo: AreaInfo object (130000)>, <AreaInfo: AreaInfo object (140000)>, <AreaIn
fo: AreaInfo object (150000)>, <AreaInfo: AreaInfo object (210000)>, <AreaInfo: AreaInfo object (220000)>, <AreaInfo: AreaInfo object (230000)>, <AreaInfo: AreaInfo objec
t (310000)>, <AreaInfo: AreaInfo object (320000)>]>
========属性number:返回当前是第几页,从1开始========
1
========属性paginator:当前页对应的Paginator对象========
<django.core.paginator.Paginator object at 0x000001DD0787F860>
========方法has_next():如果有下一页返回True========
True
========方法has_previous():如果有上一页返回True。======
False


实例代码:

view.py

def get_areainfo(requestpageindex):
   areainfos = AreaInfo.objects.filter(area_parent__isnull=True)
   # 创建paginator对象,每页显示10条
   paginator = Paginator(areainfos10)
   print("========总条目========")
   print(paginator.count)
   print("========返回页面总数========")
   print(paginator.num_pages)
   print("========返回页码列表,从1开始,例如[1, 2, 3, 4]========")
   print(paginator.page_range)

   if pageindex == '':
       pageindex = 1
   else:
       pageindex = int(pageindex)

   print("========返回Page类实例对象,表示第m页的数据,下标以1开始========")
   # 显示第几页
   areainfo_page = paginator.page(pageindex)

   print("========属性object_list:返回当前页对象的列表========")
   print(areainfo_page.object_list)

   print("========属性number:返回当前是第几页,从1开始========")
   print(areainfo_page.number)

   print("========属性paginator:当前页对应的Paginator对象========")
   print(areainfo_page.paginator)

   print("========方法has_next():如果有下一页返回True========")
   print(areainfo_page.has_next())

   print("========方法has_previous():如果有上一页返回True。======")
   print(areainfo_page.has_previous())

   if areainfo_page.has_previous():
       print("========previous_page_number:返回前一页的页码========")
       print(areainfo_page.previous_page_number())

   if areainfo_page.has_next():
       print("========next_page_number:返回下一页的页码。======")
       print(areainfo_page.next_page_number())

   return render(request"booktest/areainfos.html", {"areainfo_page"areainfo_page})

urls.py

url(r"^get_all(?P<pageindex>\d*)$", views.get_areainfo),

areainfos.html

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
</head>
<body>
<ul>
  {% for areainfo in areainfo_page.object_list %}
       <li>{{areainfo.area_title}}</li>
  {% endfor %}
</ul>
{% if areainfo_page.has_previous %}
 <a href="/get_all{{areainfo_page.previous_page_number}}">上一页</a>
{% endif %}
{% for pageindex in areainfo_page.paginator.page_range %}
  {% if pageindex == areainfo_page.number %}
  {{pageindex}}
  {% else %}
       <a href="/get_all{{pageindex}}">{{pageindex}}</a>
  {% endif%}
{% endfor %}
{% if areainfo_page.has_next %}
 <a href="/get_all{{areainfo_page.next_page_number}}">下一页</a>
{% endif %}
</body>
</html>

浏览器输入http://127.0.0.1:8000/get_all

Python日常笔记(61) - Django框架分页和省事级联_java


省市级联

本示例讲解在Django中使用jquery的ajax进行数据交互。 jquery框架中提供了$.ajax、$.get、$.post方法,用于进行异步交互,由于Django中默认使用CSRF约束,推荐使用$.get。

veiws.py

# 省市级联显示页面
def areas(request):
   return render(request"booktest/areas.html")

# 省市级联后台处理函数
def prov(requestarea_parent_id):
   if area_parent_id == "":
       areainfos = AreaInfo.objects.filter(area_parent__isnull=True)
   else:
       area_parent_id = int(area_parent_id)
       areainfos =AreaInfo.objects.filter(area_parent__id=area_parent_id)
   # 1.获取省市数据

   areainfos_list = []
   for areainfo in areainfos:
       areainfos_list.append({"areainfo_id"areainfo.id"area_title":areainfo.area_title})

   return JsonResponse({"areainfos_list"areainfos_list})

urls.py

url(r"^areas$"views.areas),  #
url(r"^prov(?P<area_parent_id>\d*)$"views.prov),  #

areas.html使用了jquery框架,需要导入一下

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="/static/js/jquery-1.11.0.js"></script>
   <script>
       $(function(){
           $.get("/prov"function(result){
               prov = $("#prov")
               $.each(result.areainfos_list,function(index,areainfo){
                   option = $("<option></option>").attr({value:areainfo.areainfo_id}).html(areainfo.area_title)
                   prov.append(option)
              })
          })


           $("#prov").change(function(){
               var area_parent_id = $(this).val()
               $.get("/prov"+area_parent_idfunction(result){
                   city = $("#city");
                   //清空城市下拉框
                   city.empty().append('<option>---请选择市---</option>');
                   //清空县级下拉框
                   $("#dis").empty().append('<option>---请选择县---</option>');
                   console.log(result)
                   $.each(result.areainfos_list,function(index,areainfo){
                       option = $("<option></option>").attr({value:areainfo.areainfo_id}).html(areainfo.area_title)
                       city.append(option)
                  })
              })
          })


           $("#city").change(function(){
               var area_parent_id = $(this).val()
               $.get("/prov"+area_parent_idfunction(result){
                   dis = $("#dis");
                   dis.empty().append('<option>---请选择县---</option>');
                   console.log(result)
                   $.each(result.areainfos_list,function(index,areainfo){
                       option = $("<option></option>").attr({value:areainfo.areainfo_id}).html(areainfo.area_title)
                       dis.append(option)
                  })
              })
          })

      })

   </script>
</head>
<body>
<select id="prov">
   <option>---请选择省---</option>
</select>
<select id="city">
   <option>---请选择市---</option>
</select>
<select id="dis">
   <option>---请选择县---</option>
</select>
</body>
</html>

浏览器输入:http://127.0.0.1:8000/areas

Python日常笔记(61) - Django框架分页和省事级联_java_02

Python日常笔记(61) - Django框架分页和省事级联_java_03