一、视图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),
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!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>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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})
四、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) # 返回一个拼接的字符串