物联网笔记-----------Django之template分页的实现

来源:互联网 发布:淘宝网咖啡杯 编辑:程序博客网 时间:2024/05/29 11:15

1、利用传统的Django 模块

适用场景:利用Django数据库API对数据库中的表的元素连续显示时。

from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

views.py中部分分页代码:

bussiness_list=Bussiness.objects.all();print(bussiness_list)try:page=request.GET.get("page",default=1)paginator= Paginator(bussiness_list,5,1);# 生成一个分页的实例,两个参数(objects是列表,2代表的是每2个元素分成一页.)bussiness_page=paginator.page(page)#paginator.page(page) 取第几页.bussiness_list = paginator.page(数字)获得的对象,是paginator分页实例,但是当我们对这个对象进行for循环时,遍历出来的还是里面的元素.except PageNotAnInteger:bussiness_page=paginator.page(1);except EmptyPage:bussiness_page=paginator.page(1);# paginator.num_pages查看总共有几页bc = {}bc['info_count']=bussiness_list.count()#数据库中记录总数bc["info_list"] = bussiness_page.object_list#当前页的对象列表bc['has_previous'] = bussiness_page.has_previous# 查看当前页是不是有上一页,如果有返回True,如果没有返回Falseif bussiness_page.has_previous:bc['previous_page_number'] = bussiness_page.previous_page_number# 查看当前页的上一页的页码.bc['range'] = paginator.page_range# 当我们想循环每一页时就需要用到这个range(1, 5)bc['number'] = bussiness_page.number#得到当前页页面的编号bc['has_next'] = bussiness_page.has_next# 查看当前页是不是有下一页,如果有返回True,如果没有Flaseif bussiness_page.has_next:bc['next'] = bussiness_page.next_page_number# 查看当前页的下一页的页码bc['end'] = bussiness_page.end_index# 查看当前页中,最后一个元素在总列表的索引值return render(request,'runhanght/stores.html',bc)

templates中HTML中的局部分页代码:

{% load runhanght_tag %}

<!--后台传字典,前台直接写键值,来获取就好--><div class="grid">    <div class="row cells3">        <div class="cell"></div>        <div class="cell">        <div class="pagination rounded" ><span class="item"><a href="?page=1">首页</a></span>{% if has_previous %}<span class="item"><a href="?page={{previous_page_number}}">上页</a></span>{% endif %}{% for page_num in range %}{% guess_page number page_num %}{% endfor %}{% if has_next %}  <span class="item"><a href="?page={{next}}">下页</a></span>{% endif %}    <span class="item"id="down"><a href="?page={{end}}">尾页</a></span></div>        </div>        <div class="cell"></div>    </div></div>


其中{%guess_page number 参数1 参数2 %}是Django中自定义的templatetags文件夹的runhanght_tag模块中的方法:

# -*- coding: utf-8 -*-from django import templatefrom django.utils.html import format_html  # 引入format_html模块register = template.Library() # 生成一个注册器,注册自定义标签和过滤器@register.simple_tag #快速创建简单tag的方法。注册到语法库,过滤语法 ,就是把数据输入进来,内部执行后把def guess_page(current_page,loop_num):offset = abs(current_page - loop_num)if offset < 2:if current_page == loop_num:page_ele ='''<span class="item current "><a href="?page=%d">%d</a></span>'''%(loop_num,loop_num)else:page_ele = '''<span class="item"><a href="?page=%d">%d</a></span>'''%(loop_num,loop_num)return format_html(page_ele)else:return ''

效果为:http://127.0.0.1:8000/aaa/aaadd/?page=1时:

http://127.0.0.1:8000/aaa/aaadd/?page=2时:

http://127.0.0.1:8000/aaa/aaadd/?page=4

2、不能用Django 模块的分页

利用传统的Django 模块分页思想,进行分页逻辑的编写,实现分页。

适用场景:需要对数据库中的表的记录进行加工并显示时;即,可能多条连续的记录,合并成将要在HTML中显示的

一条时,对加工后的新纪录进行分页显示。

views.py 中的代码:

def inforsales1(request):BussinID=request.session.get("BussinID",default="");BussinName=request.session.get("BussinName",default="");if BussinID=="":return HttpResponseRedirect("/vd/login/",{"msg":"请登录"});VenID=request.GET.get("VenID",default=-1)vendings=get_object_or_404(Vendings,VenID=VenID)infor=Inforsales.objects.filter(Ven=vendings).filter(SaPayState=1)sumprice=0.00;counts=0;for i in range(len(infor)):sumprice=sumprice+infor[i].SaTotalPricesaInforsdict=eval(infor[i].SaInfors);counts=counts+saInforsdict['nums']saFinishTime=str(datetime.now().date())recordlist=[];recorddict={}saFinishTime = saFinishTime + " 00:00:00"saFinishTime = datetime.strptime(saFinishTime, '%Y-%m-%d %H:%M:%S')nums=len(infor)for inf in infor:if nums :price=0.00;tdynums=0;saStartTime = saFinishTime + timedelta(days=-1);recorddict["saStartTime"]=datetime.strftime(saStartTime,'%Y-%m-%d')infor = Inforsales.objects.filter(SaStartTime__gte=saStartTime).filter(SaStartTime__lte=saFinishTime)saFinishTime=saStartTimefor inf in infor:price= price + inf.SaTotalPrice;saInforsdict=eval(inf.SaInfors);tdynums=tdynums+saInforsdict['nums']nums=nums-1;recorddict["price"]=price;recorddict["tdynums"]=tdynums;recorddict_copy=recorddict.copy();#该句必须加,如果不加,则recordlist中每个元素永远是最后的那个元素;因为dict类型的对象(右边值)是可变的。即,引用指的永远是最后那个新值的地址。recordlist.append(recorddict_copy);lennum=len(recordlist)#加工筛选后,总共有多少个对象元素。page=request.GET.get("page",default=1)#传过来的PageeveryPage=2;#一页几个元素#--------------------------------------------------------------modify-------------------------------------------------->if lennum%2==1 or lennum==1:#当有奇数个对象时,总页数=(奇数个对象-1)/(每页几个对象)+1rangepg=(lennum-1)//everyPage+1;else:#当有偶数个对象时,总页数=奇数个对象/(每页几个对象)rangepg=lennum//everyPage#--------------------------------------------------------------modify-------------------------------------------------->page=int(page);dc={};dc["has_previous"]=False;#假定,当前页没有上一页if page in range(1,rangepg+1) and page!=1:#当前页只要不是第一页时dc["has_previous"]=True;#当前页有上一页dc["previous_page_number"]=page-1;#上一页页号=当前页-1;if page in range(1,rangepg):#当前页只要不是最后一页时dc["has_next"]=True;#当前页有下一页dc["next"]=page+1;#下一页页号=当前页+1;dc["rangepg"]=range(1,rangepg+1)#页的范围dc["cutpage"]=page#当前页dc["end"]=rangepg#最后一页#-------------------------------------------------------------modify-------------------------------------------------->i = 0whloop=0while i < len(recordlist):if whloop<=(page-1)*everyPage-1:recordlist.pop(i)#每一轮循环,i都是0;list.pop(0),list输出并删除了index=0元素之后,list会变成list1,len(list1)=len(list)-1,即index=0的地方是新的元素。whloop=whloop+1;i -= 1else:pass;i += 1#-------------------------------------------------------------modify-------------------------------------------------->return render(request,"vd/xiaoshou.html",{"vendings":vendings,"counts":counts,"sumprice":sumprice,"recordlist":recordlist[0:2],"dc":dc,"VenID":VenID})


templates中HTML的代码:

<!DOCTYPE html>{% load static %}{% load runhanghttag %}<div id="" style="width: 1200px; margin: 0 auto;"><table class="dataTable  border bordered">                <thead>                <tr>                    <th>时间</th>                    <th>销售额</th>                    <th>销售量</th>                    <th style="text-align: center;">操作</th>                </tr>                </thead>                <tbody>{% for item in recordlist%}<tr><td>{{item.saStartTime}}</td><td>{{item.price}}</td><td>{{item.tdynums}}</td><td style="text-align: center;"><a class="roung-a" href="/vd/detail-shouhuoji/">查看详情</a></td></tr>                {%endfor%}                </tbody>            </table><div  style="float: right;"><div class="row cells3"><div class="cell"><div class="pagination rounded" ><span class="item"><a href="/vd/xiaoshou/?VenID={{VenID}}&page=1">首页</a></span>{% if dc.has_previous %}<span class="item"><a href="/vd/xiaoshou/?VenID={{VenID}}&page={{dc.previous_page_number}}">上页</a></span>{% endif %}{% for i in dc.rangepg %}{% guess_page VenID dc.cutpage forloop.counter %}{% endfor %}{% if dc.has_next %}  <span class="item"><a href="/vd/xiaoshou/?VenID={{VenID}}&page={{dc.next}}">下页</a></span>{% endif %}<span class="item"id="down"><a href="/vd/xiaoshou/?VenID={{VenID}}&page={{dc.end}}">尾页</a></span></div></div></div></div></div>

其中{%guess_page number 参数1 参数2 %}是Django中自定义的templatetags文件夹的runhanghttag模块中的方法:

# -*- coding: utf-8 -*-import typesfrom django import templatefrom vd.models import *from datetime import datetime,time,timedelta,datefrom django.core.paginator import Paginator,EmptyPage,PageNotAnIntegerfrom django.utils.html import format_html  # 引入format_html模块register = template.Library() # 生成一个注册器@register.simple_tag # 注册到语法库,过滤语法 ,就是把数据输入进来,内部执行后把def guess_page(VenID,current_page,loop_num):current_page=int(current_page)offset = abs(current_page - loop_num)if offset < 2:if current_page == loop_num:page_ele = '''<span class="item current "><a href="/vd/xiaoshou/?VenID=%s&page=%d">%d</a></span>'''%(VenID,loop_num,loop_num)else:page_ele = '''<span class="item"><a href="/vd/xiaoshou/?VenID=%s&page=%d">%d</a></span>'''%(VenID,loop_num,loop_num)return format_html(page_ele)else:return ''
效果如下:http://127.0.0.1:8000/vd/xiaoshou/?VenID=123

http://127.0.0.1:8000/vd/xiaoshou/?VenID=123&page=2



http://127.0.0.1:8000/vd/xiaoshou/?VenID=123&page=4


3、

Questions:


如上图所示,我认为列表l的值应该是[ { 'a' : 'a0' , 'b' : 'b0' },{ 'a' : 'a1' , 'b' : 'b1' } ]
但实际操作l的值是[ { 'a' : 'a1' , 'b' : 'b1' },{ 'a' : 'a1' , 'b' : 'b1' } ]。

解析:

dict在Python里是object,不属于primitive type(即int、float、string、None、bool)。这意味着你一般操控的是一个指向object(对象)的指针,而非object本身。举例来说,


所以说题主append了两个指向同一个object,也就是d,的指针。在第二个loop中改变了那个object内容,于是list里之前存的指针指向的object也自然不同了。那怎么样才可以把整个object复制一遍呢?可以看Python的copy函数。举例来说,


具体copy还有shallow copy和deep copy的区别,有兴趣可以自己去研究一下。

方法二、利用id

原因: L.append的两个d都是引用,在内存中指向的是同一个词典对象id(d),python中Dictionary是mutable的,所以L输出的内容完全一样且是修改过后的词典对象id(d)。


参考链接:https://www.zhihu.com/question/40283828?sort=created

来源:知乎


原创粉丝点击