装饰器和分页器

  • 一、装饰器(实现不登陆不能执行一些操作)
    • 1.django自带装饰器(不能实现登录后返回当前网页,不能处理ajax)
      • from django,contrib.auth.decorators import login_required
      • @login_required(login_url = '/users/user_login')  不能使用反向解析url
      • def 视图函数(request):
    • 2.建立装饰器
      • from django.shortcuts import redirect, reverse
      • from django.http import JsonResponse
      • def login_decorator(func):
        • def login_handler(request, *args, **kwargs):
          • if request.user.is_authenticated():
            • return func(request, *args, **kwargs)
          • else:
            • if request.is_ajax():  #处理ajax请求
              • return JsonResponse({
                • 'status': 'nologin'
                • })
            • url = request.get_full_path()
            • ret = redirect(reverse('users:user_login'))
            • ret.set_cookie('url', url)
            • return ret
        • return login_handler
      • views.py 登录视图函数中 实现登录后返回原网页
        • url = request.COOKIES.get("url", "/")
        • ret = redirect(url)
        • ret.delete_cookie('url')
        • return ret
  • 二.分页器
    • 视图函数中
    • from django.core.paginator import PageNotAnInteger, Paginator, EmptyPage
    • pagenum = request.GET.get('pagenum', '')
    • pa = Paginator(all_orgs, 3)
    • try:
      • page_list = pa.page(pagenum)
    • except PageNotAnInteger:
      • page_list = pa.page(1)
    • except EmptyPage:
      • page_list = pa.page(pa.num_pages)
    • return render(request,'html文件',{
      • 'page_list':page_list
      • })
    • 前端页面中
      • {% if page_list.has_previous %}  判断是否有上一页
      • {% if page_list.has_next %} 判断是否有下一页
      • {{ page_list.previous_page_number  }}   当前页上一页(整数)
      • {{ page_list.next_page_number }}  当前页下一页(整数)
      • {{ page_list.number }}   当前页序号
      • {{ page_list.paginator.num_pages }}  总页数   page_list.paginator   为分页器对象,为视图函数中的pa
    • 拓展:
      • Paginator对象
        • 创建对象
          • Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数
        • 属性
          • count:对象总数
          • num_pages:页面总数
          • page_range:页码列表,从1开始,例如[1, 2, 3, 4]
        • 方法
          • page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常
        • 异常exception
          • InvalidPage:当向page()传入一个无效的页码时抛出
          • PageNotAnInteger:当向page()传入一个不是整数的值时抛出
          • EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出
      • Page对象
      • 创建对象
        • Paginator对象的page()方法返回Page对象,不需要手动构造
      • 属性
        • object_list:当前页上所有对象的列表
        • number:当前页的序号,从1开始
        • paginator:当前page对象相关的Paginator对象
      • 方法
        • has_next():如果有下一页返回True
        • has_previous():如果有上一页返回True
        • has_other_pages():如果有上一页或下一页返回True
        • next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
        • previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
        • len():返回当前页面对象的个数

猜你喜欢

转载自blog.csdn.net/qq_41654985/article/details/80927995