<div id="cnblogs_post_body">
分页
Django的分页器(paginator)
view
django.shortcuts <span style="color: #008000;">#<span style="color: #008000;"> Create your views here.
<span style="color: #0000ff;">from app01.models <span style="color: #0000ff;">import *
<span style="color: #0000ff;">from django.core.paginator <span style="color: #0000ff;">import<span style="color: #000000;"> Paginator,EmptyPage,PageNotAnInteger
<span style="color: #0000ff;">def<span style="color: #000000;"> index(request):
</span><span style="color: #800000;">'''</span><span style="color: #800000;">
批量导入数据:
Booklist=[]
for i in range(100):
Booklist.append(Book(title="book"+str(i),price=30+i*i))
Book.objects.bulk_create(Booklist)
</span><span style="color: #800000;">'''</span>
<span style="color: #800000;">'''</span><span style="color: #800000;">
分页器的使用:
book_list=Book.objects.all()
paginator = Paginator(book_list,10)
print("count:",paginator.count) #数据总数
print("num_pages",paginator.num_pages) #总页数
print("page_range",paginator.page_range) #页码的列表
page1=paginator.page(1) #第1页的page对象
for i in page1: #遍历第1页的所有数据对象
print(i)
print(page1.object_list) #第1页的所有数据
page2=paginator.page(2)
print(page2.has_next()) #是否有下一页
print(page2.next_page_number()) #下一页的页码
print(page2.has_previous()) #是否有上一页
print(page2.previous_page_number()) #上一页的页码
# 抛错
#page=paginator.page(12) # error:EmptyPage
#page=paginator.page("z") # error:PageNotAnInteger
</span><span style="color: #800000;">'''</span><span style="color: #000000;">
book_list</span>=<span style="color: #000000;">Book.objects.all()
paginator </span>= Paginator(book_list,10<span style="color: #000000;">)
page </span>= request.GET.get(<span style="color: #800000;">'</span><span style="color: #800000;">page</span><span style="color: #800000;">'</span>,1<span style="color: #000000;">)
currentPage</span>=<span style="color: #000000;">int(page)
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(page)
book_list </span>=<span style="color: #000000;"> paginator.page(page)
</span><span style="color: #0000ff;">except</span><span style="color: #000000;"> PageNotAnInteger:
book_list </span>= paginator.page(1<span style="color: #000000;">)
</span><span style="color: #0000ff;">except</span><span style="color: #000000;"> EmptyPage:
book_list </span>=<span style="color: #000000;"> paginator.page(paginator.num_pages)
</span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">index.html</span><span style="color: #800000;">"</span>,{<span style="color: #800000;">"</span><span style="color: #800000;">book_list</span><span style="color: #800000;">"</span>:book_list,<span style="color: #800000;">"</span><span style="color: #800000;">paginator</span><span style="color: #800000;">"</span>:paginator,<span style="color: #800000;">"</span><span style="color: #800000;">currentPage</span><span style="color: #800000;">"</span>:currentPage})</pre>
<div class="cnblogs_code_toolbar">
index.html:
Title
integrity
<span style="color: #0000ff;">< <span style="color: #800000;">div <span style="color: #ff0000;">class<span style="color: #0000ff;">="container"<span style="color: #0000ff;">>
<span style="color: #0000ff;"><</span><span style="color: #800000;">h4</span><span style="color: #0000ff;">></span>分页器<span style="color: #0000ff;"></</span><span style="color: #800000;">h4</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% for book in book_list %}
</span><span style="color: #0000ff;"><</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span>{{ book.title }} -----{{ book.price }}<span style="color: #0000ff;"></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% endfor %}
</span><span style="color: #0000ff;"></</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"><</span><span style="color: #800000;">ul </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="pagination"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="pager"</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% if book_list.has_previous %}
</span><span style="color: #0000ff;"><</span><span style="color: #800000;">li </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="previous"</span><span style="color: #0000ff;">><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="/index/?page={{ book_list.previous_page_number }}"</span><span style="color: #0000ff;">></span>上一页<span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% else %}
</span><span style="color: #0000ff;"><</span><span style="color: #800000;">li </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="previous disabled"</span><span style="color: #0000ff;">><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="#"</span><span style="color: #0000ff;">></span>上一页<span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% endif %}
{% for num in paginator.page_range %}
{% if num == currentPage %}
</span><span style="color: #0000ff;"><</span><span style="color: #800000;">li </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="item active"</span><span style="color: #0000ff;">><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="/index/?page={{ num }}"</span><span style="color: #0000ff;">></span>{{ num }}<span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% else %}
</span><span style="color: #0000ff;"><</span><span style="color: #800000;">li </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="item"</span><span style="color: #0000ff;">><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="/index/?page={{ num }}"</span><span style="color: #0000ff;">></span>{{ num }}<span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% endif %}
{% endfor %}
{% if book_list.has_next %}
</span><span style="color: #0000ff;"><</span><span style="color: #800000;">li </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="next"</span><span style="color: #0000ff;">><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="/index/?page={{ book_list.next_page_number }}"</span><span style="color: #0000ff;">></span>下一页<span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% else %}
</span><span style="color: #0000ff;"><</span><span style="color: #800000;">li </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="next disabled"</span><span style="color: #0000ff;">><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="#"</span><span style="color: #0000ff;">></span>下一页<span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span><span style="color: #000000;">
{% endif %}
</span><span style="color: #0000ff;"></</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">></span>
<span style="color: #0000ff;"></ <span style="color: #800000;">div<span style="color: #0000ff;">>
<span style="color: #0000ff;"></ <span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">>
<div class="cnblogs_code_toolbar">
扩展
book_list</span>=<span style="color: #000000;">Book.objects.all()
paginator </span>= Paginator(book_list,15<span style="color: #000000;">)
page </span>= request.GET.get(<span style="color: #800000;">'</span><span style="color: #800000;">page</span><span style="color: #800000;">'</span>,1<span style="color: #000000;">)
currentPage</span>=<span style="color: #000000;">int(page)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 如果页数十分多时,换另外一种显示方式</span>
<span style="color: #0000ff;">if</span> paginator.num_pages>30<span style="color: #000000;">:
</span><span style="color: #0000ff;">if</span> currentPage-5<1<span style="color: #000000;">:
pageRange</span>=range(1,11<span style="color: #000000;">)
</span><span style="color: #0000ff;">elif</span> currentPage+5><span style="color: #000000;">paginator.num_pages:
pageRange</span>=range(currentPage-5,paginator.num_pages+1<span style="color: #000000;">)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
pageRange</span>=range(currentPage-5,currentPage+5<span style="color: #000000;">)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
pageRange</span>=<span style="color: #000000;">paginator.page_range
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(page)
book_list </span>=<span style="color: #000000;"> paginator.page(page)
</span><span style="color: #0000ff;">except</span><span style="color: #000000;"> PageNotAnInteger:
book_list </span>= paginator.page(1<span style="color: #000000;">)
</span><span style="color: #0000ff;">except</span><span style="color: #000000;"> EmptyPage:
book_list </span>=<span style="color: #000000;"> paginator.page(paginator.num_pages)
</span><span style="color: #0000ff;">return</span> render(request,locals())</pre>
<div class="cnblogs_code_toolbar">
中间件
中间件的概念
中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。
Django的中间件的定义:
如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。
大家可能频繁在view使用request.user 吧。 Django想在每个view执行之前把user设置为request的属性,于是就用了一个中间件来实现这个目标。所以Django提供了可以修改request 对象的中间件AuthenticationMiddleware 。
Django默认的Middleware :
MIDDLEWARE =
每一个中间件都有具体的功能。
自定义中间件
中间件中一共有四个方法:
process_view
process_exception
process_response
<div class="cnblogs_code_toolbar">
process_request,process_response
当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。
上述截图中的中间件都是django中的,我们也可以自己定义一个中间件,我们可以自己写一个类,但是
需要导入
注意:在使用之前需要在settings中配置一下,在MIDDLEWARE中加上我们自定义的中间件,注意顺序,从上往下加载读取,这个顺序会影响执行顺序
in views:
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #008080;">view函数...</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">"</span><span style="color: #800000;">OK</span><span style="color: #800000;">"</span>)</pre>
in Mymiddlewares.py:
django.utils.deprecation django.shortcuts <span style="color: #0000ff;">class<span style="color: #000000;"> Md1(MiddlewareMixin):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,request):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md1请求</span><span style="color: #800000;">"</span><span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> process_response(self,request,response):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">Md1返回<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> response
<span style="color: #0000ff;">class<span style="color: #000000;"> Md2(MiddlewareMixin):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,request):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md2请求</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br /> <span style="color: #008000;">#<span style="color: #008000;">return HttpResponse("Md2中断")</span></span>
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_response(self,response):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md2返回</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> response</pre>
<div class="cnblogs_code_toolbar">
结果:
:如果当请求到达请求2的时候直接不符合条件返回,即,程序将把请求直接发给中间件2返回,然后依次返回到请求者,结果如下:
返回的页面,后台打印如下:
流程图如下:
即:
当 def process_request
process_view
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="python plain">process_view(<code class="python color1">self<code class="python plain">,callback,callback_args,callback_kwargs)
</td>
</tr>
</table>
Mymiddlewares.py修改如下
django.utils.deprecation django.shortcuts <span style="color: #0000ff;">class<span style="color: #000000;"> Md1(MiddlewareMixin):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,request):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md1请求</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;">return HttpResponse("Md1中断")</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> process_response(self,response):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md1返回</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> response
</span><span style="color: #ff0000;">def process_view(self,callback_kwargs):
print("Md1view")
<span style="color: #0000ff;">class<span style="color: #000000;"> Md2(MiddlewareMixin):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,request):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md2请求</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">"</span><span style="color: #800000;">Md2中断</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_response(self,response):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md2返回</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> response
</span><span style="color: #ff0000;">def process_view(self,callback_kwargs):
print("Md2view")</span></pre>
<div class="cnblogs_code_toolbar">
结果如下:
下图进行分析上面的过程:
当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,callback_kwargs):
# return HttpResponse("hello")
response=callback(request,*callback_args,**callback_kwargs)
return response</span></pre>
<div class="cnblogs_code_toolbar">
结果如下:
注意:,但是所有的process_response都还会执行。
process_exception
示例修改如下:
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,response):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md1返回</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> response
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_view(self,callback_kwargs):
</span><span style="color: #008000;">#</span><span style="color: #008000;"> return HttpResponse("hello")</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> response=callback(request,**callback_kwargs)</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> return response</span>
<span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">md1 process_view...</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_exception(self):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">md1 process_exception...</span><span style="color: #800000;">"</span><span style="color: #000000;">)
<span style="color: #0000ff;">class<span style="color: #000000;"> Md2(MiddlewareMixin):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,request):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md2请求</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> return HttpResponse("Md2中断")</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> process_response(self,response):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">Md2返回</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> response
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_view(self,callback_kwargs):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">md2 process_view...</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_exception(self):
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">md1 process_exception...</span><span style="color: #800000;">"</span>)</pre>
<div class="cnblogs_code_toolbar">
结果如下:
Md2返回
Md1返回
<div class="cnblogs_code_toolbar">
流程图如下:
当views出现错误时:
将的修改如下:
</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">md2 process_exception...</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">"</span><span style="color: #800000;">error</span><span style="color: #800000;">"</span>)</pre>
结果如下:
<p style="margin-left: 30px;">
<p style="margin-left: 30px;">
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|