django上课笔记2-视图CBV-ORM补充-Django的自带分页-Django的自定义分页
一、视图CBV
 1.urls 
		    url(r'^login.html$', views.Login.as_view()),
	  2.views
		    from django.views import View
    class Login(View):
		      def get(self,request):
			        return HttpResponse('from get')
      def post(self,request):
			        return HttpResponse('from post')
二、ORM补充
	  正向操作
		    result = models.UserInfo.objects.all()
		    for obj in result:
			    print(obj.name,obj.age,obj.ut_id,obj.ut.title,obj.ut.fo.new_name)#通过点外键名进行连表操作ut和fo都是外键名
	  反向操作
		    obj = models.UserType.objects.all().first()
			    print(obj.id,obj.title,obj.userinfo_set_all()) # obj.userinfo_set_all()匹配用户类型相关的所有用户
for row in obj.userinfo_set_all(): #遍历每一个用户对象 print(row.name,row.age)
三、Django的自带分页
url(r'^index.html$', views.index),
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>用户列表</h1>
<ul> {# 每页显示10条信息 #}
{% for row in posts.object_list %}
<li>{{ row.name }}</li>
{% endfor %}
</ul> <div>
{% if posts.has_previous %} {# 如果有上一页,显示上一页的标签 #}
<a href="/index.html?page={{ posts.previous_page_number }}">上一页</a>
{% endif %} {% for num in posts.paginator.page_range %}
<a href="/index.html?page={{ num }}">{{ num }}</a>
{% endfor %} {% if posts.has_next %} {# 如果有下一页,显示上一页的标签 #}
<a href="/index.html?page={{ posts.next_page_number }}">下一页</a>
{% endif %}
</div>
</body>
</html>
index.html
from django.core.paginator import Paginator,Page,PageNotAnInteger,EmptyPage
def index(request):
"""
分页
:param request:
:return:
"""
# for i in range(300):
# name = "root" + str(i)
# models.UserInfo.objects.create(name=name,age=18,ut_id=1) current_page = request.GET.get('page') # URL中获取第几页 user_list = models.UserInfo.objects.all() # 数据库查询所有的数据
paginator = Paginator(user_list,10) # 页面显示出10条数据
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
try:
posts = paginator.page(current_page) # 创建page对象
except PageNotAnInteger as e: # 发生异常则默认跳到第一页
posts = paginator.page(1)
except EmptyPage as e:
posts = paginator.page(1)
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表
# number 当前页
# paginator paginator对象
return render(request,'index.html',{'posts':posts})
View.py
四、Django的自定义分页
前端模板
{# 通过视图函数传过来的user_list是指定页码之间的数据库数据 #}
{% for article in user_list %}
    <div class="article-item" style="padding: 5px 0">
        <div class="art-footer">
            <a href="#" class="foot" onclick="updown(this,{{ article.nid }},1);">
                <span class="glyphicon glyphicon-thumbs-up"></span> {# fa fa-thumbs-up点赞图标#}
                点赞({{ article.up_count }})         {# 点赞个数#}
            </a>
        </div>
    </div>
{% endfor %}
{# 在引入bootstrap的css文件后,把下面的代码放到前端模板html指定位置,显示页码图标 #}
<nav aria-label="Page navigation">
  <ul class="pagination">
      {{ page_info.pager|safe }}
  </ul>
</nav>
后端视图函数处理
def func(request):
base_url = '/%s/%s/%s/' % (blog.user.username,key,val) # 获取到当前跳转页面的URL
article_list = models.Article.objects.filter(**conditions) #数据库查询到的所有数据
all_count = article_list.count() # 获取数据库中指定对象的总条数
# request.GET.get('page'):从URL中获取当前页 all_count:总条数 10:每页显示10条
page_info = PageInfo(request.GET.get('page'), all_count, 2, base_url, 11)
user_list = article_list[page_info.start():page_info.end()] # 每页显示的数据 return render(request,'index.html',
{
'user_list': user_list,
'page_info': page_info
})
封装好的页码类处理
class PageInfo(object):
def __init__(self,current_page,all_count,per_page,base_url,show_page=11):
"""
:param current_page: 当前页
:param all_count: 数据库总行数
:param per_page: 每页显示函数
:return:
"""
try:
self.current_page = int(current_page) #把URL中获取到的当前页转换为数字
except Exception as e: # 转换出错则跳转到第一页
self.current_page = 1
self.per_page = per_page # 每页显示的条数 a,b = divmod(all_count,per_page) # 总条数除以每页条数获得一共有多少页
if b: # 如果有余数则证明剩下的不够每页显示的数目但是需要加一页
a = a +1
self.all_pager = a # all_pager 表示总页数
self.show_page = show_page # show_page 数据很多时显示11页
self.base_url = base_url # 传入要跳转的URL地址
def start(self): # 取文章数据的时候
return (self.current_page-1) * self.per_page # 当前页减一乘以每页显示的条数 第几条 def end(self):
return self.current_page * self.per_page # 当前页乘以每页显示的条数 到第几条 def pager(self):
page_list = []
# half是用来显示前五页和后五页的一个数
half = int((self.show_page-1)/2) # 显示的页码减一除以二 # 如果数据总页数 < 11
if self.all_pager < self.show_page:
begin = 1
stop = self.all_pager + 1
# 如果数据总页数 > 11
else:
# 如果当前页 <=5,永远显示1,11
if self.current_page <= half:
begin = 1
stop = self.show_page + 1
else:
if self.current_page + half > self.all_pager: #当前页加五后大于总页码的时候
begin = self.all_pager - self.show_page + 1 # 起始页为最后一页往前倒11页
stop = self.all_pager + 1 # 最后一页
else:
begin = self.current_page - half # 当前页往前倒5页
stop = self.current_page + half + 1 # 当前页往后倒5页 if self.current_page <= 1: # 当前页小于等于1时,上一页不能点
prev = "<li><a href='#'>上一页</a></li>"
else: # 当前页大于1时,上一页能点
prev = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url,self.current_page-1,)
page_list.append(prev) # 把标签放入列表中 for i in range(begin,stop):
if i == self.current_page: # 当前页等于i时证明当前页被选中加上active属性
temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,)
else:
temp = "<li><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,)
page_list.append(temp) # 把标签放入列表中 if self.current_page >= self.all_pager: # 当前页大于等于最后一页时,下一页不能点
nex = "<li><a href='#'>下一页</a></li>"
else:
nex = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url,self.current_page+1,)
page_list.append(nex) # 把标签放入列表中 return ''.join(page_list) # 返回一个拼接的字符串
django上课笔记2-视图CBV-ORM补充-Django的自带分页-Django的自定义分页的更多相关文章
- django上课笔记3-ORM补充-CSRF (跨站请求伪造)
		
一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...
 - Django 基于类的视图(CBV)执行流程 CBV 源码分析
		
一.CBV(基于类的视图) 视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码. 基本示例 D ...
 - Django学习笔记之视图高级-HTTP请求与响应
		
Django限制请求method 常用的请求method GET请求 GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改.比如向服务器获取某篇文章的详情. POST ...
 - Django学习笔记之视图高级-类视图
		
类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...
 - Django学习笔记〇四——数据库ORM的使用(有待修改)
		
Django框架基本上都是要和数据库结合使用的,我在以前讲过SQLAlchemy框架的使用,Django支持的不是SQLAlchemy,但是也内嵌了ORM框架,可以不需要直接面对数据库编程,而可以通过 ...
 - Django学习笔记(20)——BBS+Blog项目开发(4)Django如何使用Bootstrap
		
本文学习如何通过Django使用Bootstrap.其实在之前好几个Django项目中已经尝试使用过了Bootstrap,而且都留有学习记录,我已经大概有了一个大的框架,那么本文就从头再走一遍流程,其 ...
 - Django 分页组件替换自定义分页
		
Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """ ...
 - django上课笔记1-目录介绍-路由系统-ORM操作
		
一.Django目录介绍 django-admin startproject mysite # 创建名为mysite的项目 cd mysite # 切换到该目录下 python manage.py s ...
 - Django学习笔记之视图高级-CSV文件生成
		
生成CSV文件 有时候我们做的网站,需要将一些数据,生成有一个CSV文件给浏览器,并且是作为附件的形式下载下来.以下将讲解如何生成CSV文件. 生成小的CSV文件 这里将用一个生成小的CSV文件为例. ...
 
随机推荐
- golang几种post请求方式
			
get请求 get请求可以直接http.Get方法,非常简单. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 func httpGet() { resp, err := h ...
 - IP协议解读(二)
			
IP协议是TCP协议栈中的核心协议,也是网络编程的基础之中的一个. 我们接着在IP协议解读(一)继续学习 网络层作用 IP分片: IP数据报的长度超过帧的MTU时,将会被分片传输. 分片可能发生在发送 ...
 - 关于OC的内存管理-01
			
1.什么是内存管理? 大家都知道手机的内存是有限的,app应用的内存也应该是受限制的,随着app应用的使用会导致内存的占用率增大.当内存占用率达到一种程度时.系统会发出内存警告.这时我们须要把一些不用 ...
 - 【转载】C#中的泛型
			
1.1 C#中的泛型 .Net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持.通过使用泛型,我们可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱.拆箱,在一定程度上提升 ...
 - 2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用
			
今天白天主要看了boost库的应用,主要是经常使用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模 ...
 - GIF Movie Gear逆向实战+注册代码+补丁
			
GIF Movie Gear逆向实战+注册代码+补丁 准备 我是在windows 8.1 x64上进行的操作.有不足之处,还望大虾指出. 获取资源 网站下载:http://www.gamani.com ...
 - 三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)
			
这里能够简单的改动随意函数的返回地址.能够做到自己定义EIP的指向,就可以运行当前进程空间的随意指令,这里仅仅是让大家更清楚栈帧结构,没有涉及跨进程的inline HOOK 等,后面会陆续讲下读取随意 ...
 - dubbo简单配置与使用
			
dubbo简介 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时 ...
 - Golang 现有的哲学中,要求你尽量手工处理所有的错误返回
			
更优雅的 Golang 错误处理 - Go语言中文网 - Golang中文社区 https://studygolang.com/articles/9407
 - 使用JavaScript获取浏览器Chrome版本信息
			
Navigator对象包含了有关浏览器的信息 可通过访问其属性appVersion或userAgent来获取浏览器Chrome版本 例如,我所使用的QQ浏览器的appVersion和userAgent ...