最近在研究django的功能,分页功能根据官方文档可以简单的实现,但是如果配合上搜索,对搜索结果分页就要稍微费点周折。
话不多少,先上代码。
一、搜索配合分页
# 获取、判断并封装关keyword键搜索 kw = request.GET.get("keyword", None) if kw: # 查询商品名中只要含有关键字的都可以 list = mod.filter(goods__contains=kw) mywhere.append("keyword=" + kw) else: list = mod.filter() # 获取、判断并封装商品类别typeid搜索条件 typeid = request.GET.get('typeid', '0') if typeid != '0': tids = Types.objects.filter(Q(id=typeid) | Q(pid=typeid)).values_list('id', flat=True) list = list.filter(typeid__in=tids) mywhere.append("typeid=" + typeid) # 获取、判断并封装商品状态state搜索条件 state = request.GET.get('state', '') if state != '': list = list.filter(state=state) mywhere.append("state=" + state)
1.这里的mywhere的主要作用是为了维持搜索结果。因为如果搜索结果有多页的话,不把搜索参数传入url的话,点击换页,搜索的效果会消失。mywhere是一个列表,里面存着搜索条件。在模板页面里,换页按钮要这样写
<a href="{% url 'myadmin_goods_index' pIndex|add:1 %}{{ mywhere|join:'&' }}
这里是下一页的html代码。可以看到,url地址除了传入分页的页码,还传入了之前保存在mywhere中的搜索条件。url最后会变成http://……………….com/2?keyword=&typeid=&state=&,类似这种形式。大家可以去看看有搜索功能的网站,商城什么的,关注一下搜索关键词之后点击换页,它们的url变化,就可以理解了。
二、分页
上面讲了搜索维持分页,我又好奇分页的Paginator类。所以去看了看官方文档。分页主要是靠
Paginator.num_pages、Paginator.page、Paginator.page_range这几个方法实现的。
具体的代码,官方说明都有,我这里就不多说了。我用白话文解释一下。
Paginator类实例化之后,会得到一个含有页数的实例,通过num_pages可以得到一共的页数。
page方法有点类似yield,Paginator类实例化之后,会给每个记录一个索引,这个方法会把索引按顺序输出来。
page_range方法就是把页数按顺序输出来,结果是一个列表形式。
上面就是按照自己的理解,写的关于django的分页和搜索功能。可能有的地方讲的不对,希望大家指出。