django进阶技巧
2018-07-25 本文已影响0人
火乐君_52cd
权限控制
- 在有较多方法需要权限控制时:
可使用权限控制中间件,permissionMiddleWare - 在只有少量方法需要控制时:
也可使用装饰器的方法,将权限控制函数加载到需要验证的方法之前
分页器(paginator)
- 生成一个分页器的对象:
p = paginator(objects,nums)
其中objects为想要分页的对象列表,nums为每页可容纳的对象数量
- django给出的官方文档
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)#新建分页,参数为所有的obj,和每页显示数量
>>> p.count#所有的obj的数量
4
>>> p.num_pages#分出来的页数
2
>>> p.page_range#页数的列表
[1, 2]
>>> page1 = p.page(1)#得到第一页
>>> page1
<Page 1 of 2>
>>> page1.object_list#第一页的obj列表
['john', 'paul']
>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()#是否有下一页
False
>>> page2.has_previous()#是否有前一页
True
>>> page2.has_other_pages()#是否有其他页
True
>>> page2.next_page_number()#下一页的地址,这里最好判断是否有,不然会异常
Traceback (most recent call last):
...
EmptyPage: That page contains no results
- 项目中优化后的分页方法
def my_pagination(request, queryset, display_amount=15, after_range_num = 5,bevor_range_num = 4):
#按参数分页
paginator = Paginator(queryset, display_amount)
try:
#得到request中的page参数
page =int(request.GET.get('page'))
except:
#默认为1
page = 1
try:
#尝试获得分页列表
objects = paginator.page(page)
#如果页数不存在
except EmptyPage:
#获得最后一页
objects = paginator.page(paginator.num_pages)
#如果不是一个整数
except PageNotAnInteger:
#获得第一页
objects = paginator.page(1)
#根据参数配置导航显示范围
if page >= after_range_num:
page_range = paginator.page_range[page-after_range_num:page+bevor_range_num]
else:
page_range = paginator.page_range[0:page+bevor_range_num]
return objects,page_range