五.4分页之封装成类及使用

做~自己de王妃 提交于 2019-12-16 00:45:22

之前的效果中,分页的代码都是在一个视图函数里面,如果别的页面页要用到的话,我们还要复制一遍,这样代码显的很low---所以我们可以对它进行封装成类,到时候就可以用类的对象即可调用,我们可以在我们项目下面新建一个文件夹utils,在新建一个pagination.py文件,把我们分页的代码写到里面。

1.pagination.py中:

"""
分页器
"""
from django.utils.safestring import mark_safe
class Pagination: #把分页封装成一个类
    
    def __init__(self, request, all_count, per_num=10, max_show=11):#把跟值有关的都放初始函数中,并传参,那后边使用就要加self
        # 基本的URL
        self.base_url = request.path_info
        # 当前页码
        try:
            self.current_page = int(request.GET.get('page', 1))
            if self.current_page <= 0:
                self.current_page = 1
        except Exception as e:
            self.current_page = 1
        # 最多显示的页码数
        self.max_show = max_show
        half_show = max_show // 2
        
        # 每页显示的数据条数
        self.per_num = per_num
        # 总数据量
        self.all_count = all_count
        
        # 总页码数
        self.total_num, more = divmod(all_count, per_num)
        if more:
            self.total_num += 1
        
        # 总页码数小于最大显示数:显示总页码数
        if self.total_num <= max_show:
            self.page_start = 1
            self.page_end = self.total_num
        else:
            # 总页码数大于最大显示数:最多显示11个
            if self.current_page <= half_show:
                self.page_start = 1
                self.page_end = max_show
            elif self.current_page + half_show >= self.total_num:
                self.page_end = self.total_num
                self.page_start = self.total_num - max_show + 1
            else:
                self.page_start = self.current_page - half_show
                self.page_end = self.current_page + half_show
    
    @property
    def start(self):
        return (self.current_page - 1) * self.per_num
    
    @property
    def end(self):#起始页码要根据当前页码和每页显示的页码个数进行计算,所以单独写方法
        return self.current_page * self.per_num
    
    @property
    def show_li(self):#终止页码要根据当前页码和每页显示的页码个数进行计算,所以单独写方法
        # 存放li标签的列表
        html_list = []
        
        first_li = '<li><a href="{}?page=1">首页</a></li>'.format(self.base_url)
        html_list.append(first_li)
        
        if self.current_page == 1:
            prev_li = '<li class="disabled"><a><<</a></li>'
        else:
            prev_li = '<li><a href="{1}?page={0}"><<</a></li>'.format(self.current_page - 1, self.base_url)
        html_list.append(prev_li)
        
        for num in range(self.page_start, self.page_end + 1):
            if self.current_page == num:
                li_html = '<li class="active"><a href="{1}?page={0}">{0}</a></li>'.format(num, self.base_url)
            else:
                li_html = '<li><a href="{1}?page={0}">{0}</a></li>'.format(num, self.base_url)
            html_list.append(li_html)
        
        if self.current_page == self.total_num:
            next_li = '<li class="disabled"><a>>></a></li>'
        else:
            next_li = '<li><a href="{1}?page={0}">>></a></li>'.format(self.current_page + 1, self.base_url)
        
        html_list.append(next_li)
        
        last_li = '<li><a href="{1}?page={0}">尾页</a></li>'.format(self.total_num, self.base_url)
        html_list.append(last_li)
        
        return mark_safe(''.join(html_list))

  

2.views.py中:

from django.shortcuts import render, redirect
from django.contrib import auth
from crm.forms import RegForm
from crm import models
from django.utils.safestring import mark_safe
from utils.pagination import Pagination

def login(request):
    err_msg = ''
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        obj = auth.authenticate(request, username=username, password=password)
        if obj:
            return redirect('/index/')
        err_msg = '用户名或密码错误'
    
    return render(request, 'login.html', {'err_msg': err_msg})

# 注册
def reg(request):
    form_obj = RegForm()
    if request.method == 'POST':
        form_obj = RegForm(request.POST)
        if form_obj.is_valid():
            # 创建新用户
            # 方法一
            # form_obj.cleaned_data.pop('re_password')
            # models.UserProfile.objects.create_user(**form_obj.cleaned_data)
            
            # 方法二
            obj = form_obj.save()
            obj.set_password(obj.password)
            obj.save()
            
            return redirect('/login/')
    return render(request, 'reg.html', {'form_obj': form_obj})


# 展示客户列表
def customer_list(request):
    all_customer = models.Customer.objects.all()
    page = Pagination(request, all_customer.count())
    
    return render(request, 'crm/customer_list.html',
                  {"all_customer": all_customer[page.start:page.end], 'pagination':page.show_li})

# 测试分页
# 测试数据
users = [{'name': 'alex{}'.format(i), 'pwd': 'alexdsb{}'.format(i)} for i in range(1, 302)]
def user_list(request):
    page = Pagination(request, len(users))
    
    return render(request, 'user_list.html',
                  {
                      "data": users[page.start:page.end],
                      # 'total_num': range(page_start, page_end + 1)
                      'html_str': page.show_li
                  })

  

3.页面效果:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!