1. CBV
1.1 指一个url对应一个类
views中类的写法:
from django.views import View 要导入View class Index(View): 创建类,但必须继承View def get(self,request): 创建方法get,如果是get请求的话,则直接执行里面的代码 pass def post(self,request): 创建方法post,如果是post请求的话,则直接执行里面的代码 pass
1.2 在urls文件中,添加一个url,对应类名的写法:
url(r'^index/', views.Index.as_view), 对应类名的同时,后面必须写as_view
1.3 常用的发送请求的方式:
get 查 post 创建 put 更新 delete 删除
1.4 实现执行get或post请求前/后 可以执行其他操作:
class Index(View): def dispatch(self, request, *args, **kwargs): print('before') object = super().dispatch(request, *args, **kwargs) 继承父类的 dispatch方法 print('after') return object def get(self,request): pass def post(self,request): pass
2. FBV
指的是一个url对应一个函数function,第一天中的那种写法就是FBV
3. 自定义分页
3.1 django 自带分页功能
from django.core.paginator import Paginator current_page = request.GET.get('page') 手动的用get方式传一个值 user_list = models.UserInfo.objects.all() 获取UserInfo所有数据 paginator = Paginator(user_list,10) 设置每页显示多少条数据 try: posts = paginator.page(current_page) 显示当前页数,current_page的值必须是一个数字 except Exception: posts = paginator.page(1) 如果不是一个数字,则返回第一页
3.2 paginator对象的方法
# per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 posts对象的方法 # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 <ul> {% for posts in posts.object_list %} <li> {{ posts.name }} 每页显示的数据 </li> {% endfor %} </ul> <div> {% if posts.has_previous %} 判断是否有上一页 <a href="/test.html/?page={{ posts.previous_page_number }}">上一页</a> {% endif %} {% for i in posts.paginator.page_range %} 显示每页的页码 <a href="/test.html/?page={{ i }}">{{ i }}</a> {% endfor %} {% if posts.has_next %} 判断是否有下一页 <a href="/test.html/?page={{ posts.next_page_number }}">下一页</a> {% endif %} </div>
4. 自定义分页
1 class PageInfo(object): 2 3 def __init__(self,current_page,all_count,per_page,base_url,show_page=11): 4 """ 5 6 :param current_page: 7 :param all_count: 数据库总行数 8 :param per_page: 每页显示行数 9 :return: 10 """ 11 try: 12 self.current_page = int(current_page) 13 except Exception as e: 14 self.current_page = 1 15 self.per_page = per_page 16 17 a,b = divmod(all_count,per_page) 18 if b: 19 a = a +1 20 self.all_pager = a 21 self.show_page = show_page 22 self.base_url = base_url 23 def start(self): 24 return (self.current_page-1) * self.per_page 25 26 def end(self): 27 return self.current_page * self.per_page 28 29 def pager(self): 30 # v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>" 31 # return v 32 page_list = [] 33 34 half = int((self.show_page-1)/2) 35 36 # 如果数据总页数 < 11 37 if self.all_pager < self.show_page: 38 begin = 1 39 stop = self.all_pager + 1 40 # 如果数据总页数 > 11 41 else: 42 # 如果当前页 <=5,永远显示1,11 43 if self.current_page <= half: 44 begin = 1 45 stop = self.show_page + 1 46 else: 47 if self.current_page + half > self.all_pager: 48 begin = self.all_pager - self.show_page + 1 49 stop = self.all_pager + 1 50 else: 51 begin = self.current_page - half 52 stop = self.current_page + half + 1 53 54 if self.current_page <= 1: 55 prev = "<li><a href='#'>上一页</a></li>" 56 else: 57 prev = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url,self.current_page-1,) 58 page_list.append(prev) 59 60 for i in range(begin,stop): 61 if i == self.current_page: 62 temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,) 63 else: 64 temp = "<li><a href='%s?page=%s'>%s</a></li>" %(self.base_url,i,i,) 65 page_list.append(temp) 66 67 if self.current_page >= self.all_pager: 68 nex = "<li><a href='#'>下一页</a></li>" 69 else: 70 nex = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url,self.current_page+1,) 71 page_list.append(nex) 72 73 74 return ''.join(page_list)
def user_list(request): all_count = models.User.objects.all().count() page_info = Page_Info(request.GET.get('page'), all_count, 10, '/user_list/', 11) user_list = models.User.objects.all()[page_info.start():page_info.end()] return render(request, 'costom.html', {'user_list': user_list, 'page_info': page_info})
1 <ul> 2 {% for rows in user_list %} 3 <li> 4 {{ rows.name }} 5 </li> 6 {% endfor %} 7 </ul> 8 <nav aria-label="Page navigation" style="text-align: center"> 9 <ul class="pagination"> 10 {{ page_info.pager|safe }} 11 </ul> 12 </nav>