django分页(原生分页)

不使用django内置的分页进行分页   

提取到模块中后续可以直接调用


utils   pagination.py文件内容

class Page(object):
    def __init__(self, current_page, all_count,base_url, per_page=10, pager_page_count=11):
        '''
        分页的初始化
        :param current_page:当前页码 
        :param all_count: 数据库的总数据条数
        :param per_page: 每页显示的数据条数
         :param pager_page_count:页面上最多显示多少页码
        '''
        self.base_url=base_url
        self.current_page = current_page
        self.per_page = per_page
        self.all_count = all_count
        self.pager_page_count = pager_page_count
        pager_count, b = divmod(all_count, per_page)
        if b != 0:
            pager_count += 1
        # 总页码
        self.pager_count = pager_count

        #页码前后范围
        half_pager = int(pager_page_count / 2)
        self.half_pager = half_pager
    @property
    def start(self):
        '''
        :return:数据库获取值起始位置 
        '''
        start = (self.current_page - 1) * self.per_page
        return start
    @property
    def end(self):
        '''
        :return:数据库获取值结束位置 
        '''
        end = self.current_page * self.per_page
        return end

    def page_html(self):
        '''
        :return:生成html页码
        '''
        # 如果总页码不足
        if self.pager_count < self.pager_page_count:
            page_start = 1
            page_end = self.pager_count
        else:  # 数据已经超过11条 判断当前页的大小
            if self.current_page <= self.half_pager:
                page_start = 1
                page_end = 11
            else:
                # 如果当前页码+5大于总页码  结尾按总页码
                if self.current_page + 5 > self.pager_count:
                    page_end = self.pager_count
                    page_start = self.pager_count - self.per_page
                else:
                    page_start = self.current_page - self.half_pager
                    page_end = self.current_page + self.half_pager

        page_list = []
        if self.current_page == 1:
            prev = '<a href="#">上一页</a>'
        else:
            prev = '<a   href="%s?page=%s">上一页</a>' % (self.base_url,self.current_page - 1)
        page_list.append(prev)
        # for i in range(1,pager_count+1):
        for i in range(page_start, page_end + 1):
            if self.current_page == i:
                tp1 = '<a class="active" href="%s?page=%s">%s</a>' % (self.base_url,i, i,)
            else:
                tp1 = '<a href="%s?page=%s">%s</a>' % (self.base_url,i, i,)
            page_list.append(tp1)
        if self.current_page >= self.pager_count:
            nex = '<a href="#">下一页</a>'
        else:
            nex = '<a   href="%s?page=%s">下一页</a>' % (self.base_url,self.current_page + 1)
        page_list.append(nex)
        page_str = "".join(page_list)
        return page_str



views文件  尾部为分页

from django.shortcuts import render, HttpResponse, redirect
from app01 import models
from app01.utils import md5
from utils.pagination import Page
from django.views.decorators.csrf import csrf_exempt, csrf_protect

# 装饰器:csrf_exempt指定某个视图函数不使用
# 装饰器:csrf_protect 指定某个视图函数使用,默认全站不启用

import datetime


# 用装饰器 可以不用每个views都写获取session
def auth(func):
    def inner(request, *args, **kwargs):
        ck = request.session.get('yyyyyyyy')
        print(ck)
        if not ck:
            return redirect('/login.html')
        return func(request, *args, **kwargs)

    return inner


# Create your views here.
def index(request):
    # 获取cookie
    # ck = request.COOKIES.get('uuuuuuuu')

    # 获取session
    ck = request.session.get('yyyyyyyy')
    print(ck)
    if not ck:
        return redirect('/login.html')
    user = request.session.get('yyyyyyyy')
    return render(request, 'index.html', {'user': user})


@auth
def order(request):
    return HttpResponse('订单列表')


def login(request):
    if request.method == "GET":
        return render(request, 'login.html', locals())
    else:
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        pwd = md5.encrypt(pwd)
        obj = models.UserInof.objects.filter(username=user, password=pwd).first()
        # if user == 'alex' and pwd == '123':
        if obj:
            # #添加cookie
            # response=redirect('/index.html')
            # deadline=datetime.datetime.utcnow() +datetime.timedelta(seconds=5)
            # response.set_cookie('uuuuuuuu',user,expires=deadline,path='/')
            # return response

            # session
            # 生成随机字符串
            # cookie发送给客户端
            # 服务端随机字符串为key  自己设置一些value
            request.session['yyyyyyyy'] = user
            return redirect('/index.html')
        else:
            return render(request, 'login.html', {'msg': '用户名或密码错误'})


def logout(request):
    request.session.clear()
    return redirect('/index.html')


def icbc(request):
    if request.method == 'GET':
        return render(request, 'icbc.html')
    else:
        return HttpResponse('...')


def test(request):
    # return render(request,'test.html',{'a':123})
    return render(request, 'test.html', {'a': 'xp'})

#
# def hosts(request):
#     '''
#     主机列表
#     :param request:请求相关的所有数据
#     :return:
#     '''
#
#     # 创建三百条数据
#     # for i in range(1,303):
#     #     # models.Host.objects.bulk_create()
#     #     hostname='c%s.com' %i
#     #     port=i
#     #     models.Host.objects.create(hostname=hostname,port=port)
#     # return HttpResponse('创建成功')
#
#     # 当前页
#     current_page = int(request.GET.get('page'))
#     # 每页显示10条数据
#     per_page = 10
#
#     start = (current_page - 1) * per_page
#     end = current_page * per_page
#
#     host_list = models.Host.objects.all()[start:end]  # []限制范围
#
#     # 生成页码
#     # 数据总条数
#     all_count = models.Host.objects.all().count()
#     pager_count, b = divmod(all_count, per_page)
#     if b != 0:
#         pager_count += 1
#
#     # 配置页码范围
#     pager_page_count = 11
#     half_pager = int(pager_page_count / 2)
#
#     # 如果总页码不足
#     if pager_count < pager_page_count:
#         page_start = 1
#         page_end = pager_count
#     else:  # 数据已经超过11条 判断当前页的大小
#         if current_page <= half_pager:
#             page_start = 1
#             page_end = 11
#         else:
#             # 如果当前页码+5大于总页码  结尾按总页码
#             if current_page + 5 > pager_count:
#                 page_end = pager_count
#                 page_start = pager_count - per_page
#             else:
#                 page_start = current_page - half_pager
#                 page_end = current_page + half_pager
#
#     page_list = []
#     if current_page == 1:
#         prev = '<a href="#">上一页</a>'
#     else:
#         prev = '<a   href="/hosts.html/?page=%s">上一页</a>' % (current_page - 1)
#     page_list.append(prev)
#     # for i in range(1,pager_count+1):
#     for i in range(page_start, page_end + 1):
#         if current_page == i:
#             tp1 = '<a class="active" href="/hosts.html/?page=%s">%s</a>' % (i, i,)
#         else:
#             tp1 = '<a href="/hosts.html/?page=%s">%s</a>' % (i, i,)
#         page_list.append(tp1)
#     if current_page >= pager_count:
#         nex = '<a href="#">下一页</a>'
#     else:
#         nex = '<a   href="/hosts.html/?page=%s">下一页</a>' % (current_page + 1)
#     page_list.append(nex)
#     page_str = "".join(page_list)
#     # page_str = '''
#     #
#     #  <a href="/hosts.html/?page=2">2</a>
#     #  <a href="/hosts.html/?page=3">3</a>
#     #  <a href="/hosts.html/?page=4">4</a>
#     # '''
#     return render(request, 'hosts.html', {'host_list': host_list, 'page_str': page_str})

def hosts(request):
    current_page=int(request.GET.get('page'))
    all_count=models.Host.objects.all().count()
    # page_obj=Page(current_page,all_count,'/hosts.html')
    page_obj=Page(current_page,all_count,request.path_info)   #path_info包含当前url
    # host_list=models.Host.objects.all()[page_obj.start(),page_obj.end()] 添加property装饰器后不用再加()调用
    host_list = models.Host.objects.all()[page_obj.start:page_obj.end]
    page_str=page_obj.page_html()
    return render(request, 'hosts.html', {'host_list': host_list, 'page_str': page_str})


models.py内容

from django.db import models


# Create your models here.

class UserInof(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    email = models.EmailField(null=True)


class Host(models.Model):
    hostname = models.CharField(max_length=32)
    port = models.CharField(max_length=10)

urls.py文件内容

url(r'^hosts.html/', views.hosts),


猜你喜欢

转载自blog.csdn.net/wuxingpu5/article/details/78206574
今日推荐