django模板分页器

对于嘉宾管理页面来说,当前需要一个分页功能,一场发布会需要由几千位嘉宾参加,如果将所有的嘉宾信息不做分页地显示在页面上,不仅页面的加载速度会受到严重影响,而且页面一次显示几千条甚至几万条并不方便查看,Django提供了Paginator类来实现分页功能,分页功能略为复杂,首先进入Django的shell模式,练习Paginator类的基本使用,请在嘉宾表至少添加5名嘉宾信息,以便接下来的练习,sign_guest表里已创建5条数据

django模板分页器_第1张图片

from django.core.paginator import Paginator    # 导入Paginator类
from sign.models import Guest # Guest下面所有表
guest_list = Guest.objects.all() # 查询Guest表得所有数据
p = Paginator(guest_list, 2) # 创建每页2条数据的分页器
p.count # 查看共有多少条数据
p.page_range # 查看共分多少页(每页2条数据),循环结果为1,2,3(共3页)
######第一页######
page1 = p.page(1) # 获取第1页数据
page1 # 当前第几页,打印出
page1.object_list # 当前页的对象,打印出]
for g in page1: # 循环打印第1页嘉宾的realname
g.realname

######第二页######
page2 = p.page(2) # 获取第2页数据
page2.start_index() # 本页第一条数据,打印3
page2.end_index() # 本页最后一条数据,打印4
page2.has_previous() # 是否有上一页,打印True
page2.has_next() # 是否有下一页,打印True
page2.previous_page_number() # 上一页是第几页
page2.next_page_number() # 下一页是第几页


######第三页######
page3 = p.page(3) # 获取第3页数据
page3.has_next() # 是否有下一页,打印False
page3.has_previous() # 是否有上一页,打印True
page3.has_other_pages() # 是否有其他页,打印True
page3.previous_page_number() # 上一页是第几页,打印2

django模板分页器_第2张图片

下面就来实现分页吧,打开/sign/views.py文件,修改guest_manage()视图函数

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
# 嘉宾管理
@login_required
def guest_manage(request):
username = request.session.get('user', '')
guest_list = Guest.objects.all()
paginator = Paginator(guest_list, 2)
page = request.GET.get('page')
try:
contacts = paginator.page(page)
except PageNotAnInteger:
contacts = paginator.page(1) # 如果page不是整数,取第一页面数据
except EmptyPage:
contacts = paginator.page(paginator.num_pages) # 如果page不在范围,取最后一页面
return render(request, 'guest_manage.html', {'user': username, 'guests': contacts})

paginator = Paginator(guest_list, 2) 把查询出来的所有嘉宾列表guest_list放到Paginator类中,划分每页显示2条数据,一般情况下,一页会显示10条数据,由于我们的测试数据较少,所以这里划分为每页2条
page = request.GET.get('page') 通过GET请求得到当前要显示第几页的数据
contacts = paginator.page(page) 获取第page页的数据,如果没有第page页,抛出PageNotAnInteger异常,返回第一页的数据,如果超出页数范围,则抛出EmptyPage异常,返回最后一页的数据,最后将得到的某一页数据返回至嘉宾管理页面上

在/templates/guest_manage.html文件中添加分页器的代码:


最后运行guest_manage.html可以看到嘉宾管理分页功能,我的代码不知道哪里出问题了,没有看到

 

签到功能:
对于发布会签到系统来说,最重要的功能就是签到,而发布会管理功能和嘉宾管理功能都要服务于签到功能
添加签到链接:

对于签到功能页面来说,它应该所属于某一场发布会,在打开签到页面之前,我们应该知道这是属于哪一场发布会的签到,所以最好的方式是在发布会列表中,给每一条发布会都提供一个签到链接,用来打开对应的签到页面,在/templates/event_manage.html页面,增加一列签到链接,新增的代码如下:

django模板分页器_第3张图片

运行event_manage.html,发布会管理列表多了一列签到链接,当点击sign链接时,路径会默认跳转到/sign_index/{{ event.id }}/路径,其中{{ event.id }}为发布会的id,target="{{ event.id }}_blank属性设置链接在新窗口打开,在/guest/urls.py文件中添加签到页面路径的路由,urls.py文件中新增的代码如下:

django模板分页器_第4张图片

此处与之前添加的路径在匹配方式上略有不同,(?P[0-9]+)匹配发布会id,而且必须为数字,匹配的数字eid将会作为sign_index()视图函数的参数

签到页面:

打开/sign/views.py文件,创建sign_index()视图函数,views.py文件里新增的代码如下:

from django.shortcuts import render, get_object_or_404
# 签到页面
@login_required
def sign_index(request, eid):
event = get_object_or_404(Event, id=eid)
return render(request, 'sign_index.html', {'event': event})

sign_index()函数获取从url配置得到的eid,作为发布会的id的查询条件,这里又学到一个很有用的方法,get_object_or_404(),它默认调用django的table.objects.get()方法,如果查询的对象不存在,则会抛出一个HTTP404异常,这就省去了table.objects.get()方法的异常断言,创建/templates/sign_index.html签到页面,新增的代码如下:




{% load bootstrap3 %}
{% bootstrap_css %}
{% bootstrap_javascript %}

Guest Manage








{{ event.name }} 将页面标题设置为发布会名称

转载于:https://www.cnblogs.com/laosun0204/p/11202666.html

你可能感兴趣的:(python,javascript,shell)