列表分页库
-
- 我们通过ddjango-pure-pagination这个库来实现分页功能,进入虚拟环境执行安装以下命令。
然后去settings.py文件里,注册这个app:
- 我们通过ddjango-pure-pagination这个库来实现分页功能,进入虚拟环境执行安装以下命令。
'pure_pagination',
我们继续下拉,看一下官方给的例子:
# views.py
from django.shortcuts import render_to_response
from pure_pagination import Paginator, EmptyPage, PageNotAnInteger
def index(request):
# 尝试获取页数参数
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
# objects是取到的数据
objects = ['john', 'edward', 'josh', 'frank']
# 对取到的数据进行分页
p = Paginator(objects, request=request)
# 此时前台显示的就是我们此前获取的第几页的数据
people = p.page(page)
return render_to_response('index.html', {
'people': people,
}
我们尝试对照实现:
# 课程机构列表功能
class OrgView(View):
def get(self, request):
# 查找所有的城市信息
all_citys = CityDict.objects.all()
# 查找所有的课程机构信息
all_orgs = CourseOrg.objects.all()
# 统计课程机构的数量
org_nums = all_orgs.count()
# 对课程机构进行分页,尝试获取前端get请求传递过来的page参数
# 如果是不合法的配置参数则默认返回第一页
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
# 这里指从all_org中取五个出来,每页显示6个,这个字段必填
p = Paginator(all_orgs, 6, request=request)
orgs = p.page(page)
return render(request, "org-list.html", {
"all_citys": all_citys,
"all_orgs": orgs,
"org_nums": org_nums,
})
查阅官方文档吧!
往下拉,可以看到这段代码,这就是官方文档告诉我们如何自定义分页样式的:
{% load i18n %}
{% if page_obj.has_previous %}
‹‹ {% trans "previous" %}
{% else %}
‹‹ {% trans "previous" %}
{% endif %}
{% for page in page_obj.pages %}
{% if page %}
{% ifequal page page_obj.number %}
{{ page }}
{% else %}
{{ page }}
{% endifequal %}
{% else %}
...
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
{% trans "next" %} ››
{% else %}
{% trans "next" %} ››
{% endif %}
注意:这里面的page_obj其实就是我们的all_orgs!
下面我们继续尝试对照实现,打开org-list.html页面,找到对应位置,复制官方文档内容,然后进行替换(代码格式化ctrl+alt+L):
{% if all_orgs.has_previous %}
- 上一页
{% endif %}
{% for page in all_orgs.pages %}
{% if page %}
{% ifequal page all_orgs.number %}
- {{ page }}
{% else %}
- {{ page }}
{% endifequal %}
{% else %}
- ...
{% endif %}
{% endfor %}
{% if all_orgs.has_next %}
- 下一页
{% endif %}
城市分类的筛选
首先打开我们的organization/views.py文件,在里面添加如下数据:
city_id = request.GET.get('city', '')
# 选中了某个城市之后,根据城市Id与数据库中的city_id进行判断(外键city在数据库中名为city_id且为字符串类型)
if city_id:
all_orgs = all_orgs.filter(city_id=int(city_id))
return render(request, "org-list.html", {
"city_id": city_id,
})
然后打开org-list.html页面,我们需要回传我们的city_id并加以显示出来:
全部 # 判断是否选择城市,如果没有则显示全部,并显示加绿状态
{% for city in all_citys %}
{{ city.name }} # 判断是否选择城市并显示加绿状态
{% endfor %}
授课机构排名
授课机构排名就是图片中右边的那个,我们根据课程机构的点击数来进行排名:
# 授课机构的排名
hot_orgs = all_orgs.order_by("click_nums")[:3] # 返回的是一个QueryDict我们取前三个
然后我们在org-list.html页面进行修改代码:
授课机构排名
{% for current_org in hot_orgs %}
- {{ forloop.counter }}
-
{{ current_org.name }}
{{ current_org.address }}
{% endfor %}
其中{{ forloop.counter }}是Django内置的用于统计循环变量循环到第几次的次数。
完成以后,我们再来刷新一下我们的页面,发现授课机构排名没有问题!
学习人数和课程人数排名
其实这个功能和前面介绍的几个功能很相似,这里就简单介绍一下(步骤和前面的类似)
首先打开我们的organization/views.py文件,在里面添加如下数据:
# 学习人数和课程人数排名
sort = request.GET.get('sort', '')
if sort:
if sort == "students":
all_orgs = all_orgs.order_by("-students")
elif sort == "courses":
all_orgs = all_orgs.order_by("-course_nums")
return render(request, "org-list.html", {
"sort": sort,
})
然后我们在org-list.html页面进行修改代码:
sort=students&ct={{ category }}&city={{ city_id }}和sort=courses&ct={{ category }}&city={{ city_id }}也是为了和前面的保持联动状态。