一、返回原页码
在我们管理的页面,以数据编辑为例,通常我们编辑完数据会让其跳转到数据展示页面,但是其通常会跳转到数据展示页面的第一页,比如我们在第3页编辑的数据,编辑成功后跳转的显示页面是第1页,显然我希望的结果是编辑那一页内容,最后跳转到那一页。以第3页某一条数据编辑为例:
步骤1:
在获取数据展示页面的视图中,将当前url中包含页码page=3等所有url参数获取,然后经过处理后将参数存在“编辑”按钮的url中;编辑后获取其url中的page参数,拼接成要跳转的数据展示页面url,这样就能实现从哪儿来,回哪儿去。
展示数据视图代码:
''' 通过如下形式将获取的url参数作为整体,以一个键值对存, 目的是解决当前这些参数可能与要拼接的url中某些参数名 相同 ''' from django.http import QueryDict params=QueryDict() #request.GET属于此数据类型 params._mutable=True #作用是使得QueryDict()可插入数据 params["_listfilter"]=request.GET.urlencode() #获得url中的参数 list_condition=params.urlencode() #如:_listfilter=page%3D7
展示数据html代码:
编辑视图代码:
def edit(reqeust,id): if reqeust.method=="POST": # 更新保存数据 url="/users/?%s"%reqeust.GET.get("_listfilter") return redirect(url) return render(reqeust,"edit.html")
二、显示上一页url参数
通常我们访问某一页面时,url中会有很多参数,当我们翻到下一页后,怎么保证除了页码参数以外,其他参数一样的显示。具体解决办法就是把当前页面的url存到页码中每个页码后的url中,当然要保证page参数是要与页码数对应的。具体见如下page插件。
""" 分页组件使用示例: obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info) page_user_list = USER_LIST[obj.start:obj.end] page_html = obj.page_html() return render(request,'index.html',{'users':page_user_list,'page_html':page_html}) """ class Pagination(object): def __init__(self,current_page,all_count,base_url,params,per_page_num=3,pager_count=11): """ 封装分页相关数据 :param current_page: 当前页 :param all_count: 数据库中的数据总条数 :param per_page_num: 每页显示的数据条数 :param params: 当前请求路径中的参数,request.GET :param base_url: 分页中显示的URL前缀 :param pager_count: 最多显示的页码个数 """ try: current_page = int(current_page) except Exception as e: current_page = 1 if current_page <1: current_page = 1 self.current_page = current_page self.all_count = all_count self.per_page_num = per_page_num self.base_url = base_url # 总页码 all_pager, tmp = divmod(all_count, per_page_num) if tmp: all_pager += 1 self.all_pager = all_pager self.pager_count = pager_count self.pager_count_half = int((pager_count - 1) / 2) # params=request.GET {"page":5,"id":1} import copy params=copy.deepcopy(params) params._mutable=True self.params=params # self.params : {"page":5,"id":1} @property def start(self): return (self.current_page - 1) * self.per_page_num @property def end(self): return self.current_page * self.per_page_num def page_html(self): # 如果总页码 < 11个: if self.all_pager <= self.pager_count: pager_start = 1 pager_end = self.all_pager + 1 # 总页码 > 11 else: # 当前页如果<=页面上最多显示11/2个页码 if self.current_page <= self.pager_count_half: pager_start = 1 pager_end = self.pager_count + 1 # 当前页大于5 else: # 页码翻到最后 10 if (self.current_page + self.pager_count_half) > self.all_pager: pager_start = self.current_page - self.pager_count_half pager_end = self.all_pager + 1 else: pager_start = self.current_page - self.pager_count_half pager_end = self.current_page + self.pager_count_half + 1 page_html_list = [] # {"page":5,"id":9} self.params["page"]=1 # self.params:{"page":1,"id":9} first_page = '<li><a href="%s?%s">首页</a></li>' % (self.base_url,self.params.urlencode(),) page_html_list.append(first_page) if self.current_page <= 1: prev_page = '<li class="disabled"><a href="#">上一页</a></li>' else: self.params["page"]=self.current_page - 1 prev_page = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url,self.params.urlencode(),) page_html_list.append(prev_page) for i in range(pager_start, pager_end): self.params["page"] =i if i == self.current_page: temp = '<li class="active"><a href="%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,) else: temp = '<li><a href="%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,) page_html_list.append(temp) if self.current_page >= self.all_pager: next_page = '<li class="disabled"><a href="#">下一页</a></li>' else: next_page = '<li><a href="%s?page=%s">下一页</a></li>' % (self.base_url,self.current_page + 1,) page_html_list.append(next_page) last_page = '<li><a href="%s?page=%s">尾页</a></li>' % (self.base_url,self.all_pager,) page_html_list.append(last_page) return ''.join(page_html_list)