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, 2, 3, 4]========
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(request, pageindex):
areainfos = AreaInfo.objects.filter(area_parent__isnull=True)
# 创建paginator对象,每页显示10条
paginator = Paginator(areainfos, 10)
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
省市级联
本示例讲解在Django中使用jquery的ajax进行数据交互。 jquery框架中提供了$.ajax、$.get、$.post方法,用于进行异步交互,由于Django中默认使用CSRF约束,推荐使用$.get。
veiws.py
# 省市级联显示页面
def areas(request):
return render(request, "booktest/areas.html")
# 省市级联后台处理函数
def prov(request, area_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_id, function(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_id, function(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