通常来讲,网站上的数据请求分为get和post请求。
在django框架中,有一个分页器叫Paginator,使用它来分页是非常方便简单的。
在csdn或者简书上随便查查就能找到你想要的教程,但是都是get请求的,比如博客系统的分页什么的。
那么如果是post请求,分页该怎么弄呢?
比如,博客系统,我发送post请求查询关于django的结果,有1000多条,那要分页怎么办呢?
看一下我下面的写的代码你估计就会了。
def search(request): num=10 if request.method=='POST': key=request.POST.get('key')#获取用户从搜索框post过来的关键词 request.session['key']=key #用session将这个关键词记住 posts=Posts.objects.filter(Q(title__icontains=key) | Q(content__icontains=key)).all() #查询符合条件的文章 cnt=posts.count() paginator=Paginator(posts,num)#进行分页 postobj=paginator.page(1)#第一页的内容 context={ 'pageobj':postobj, 'tagname':'共有{}条关于{}的搜索结果'.format(cnt,key), 'tags':alltags(), } return render(request,'search.html',context=context) if request.method=='GET': pg_num = int(request.GET.get('page', 1)) key=request.session.get('key','') if key=='': return render(request,'404.html') else: posts=Posts.objects.filter(Q(title__icontains=key) | Q(content__icontains=key)).all() cnt=posts.count() paginator=Paginator(posts,num) postobj=paginator.page(pg_num) context={ 'pageobj':postobj, 'tagname':'共有{}条关于{}的搜索结果'.format(cnt,key), 'tags':alltags(), } return render(request,'search.html',context=context)
上面是将一个搜索结果进行分页的代码。
num=10,表示10条结果为一页
先判断用户发送的是否为post查询,如果是正常的post查询,就将结果进行分页,并用session记住用户发送的post请求的关键词,但用户翻页的时候,获取页码,再用这个关键词去筛选结果。
如果用户直接访问搜索页,发送的get请求,或者post请求查询内容为空的时候,就会提示404错误,这样避免一些人使用这个搜索框的get和post请求进行捣乱。
这是我的实现思路,大家可以根据自己的需要稍作修改。
标签: