django 分页处理


import re
from django.core.paginator import Paginator, InvalidPage
from django.db.models.query import QuerySet
from django.utils.translation import ugettext_lazy as _
import math

class Page(object):
    def __init__(self, queryset, request=None, pageno=1, paginate_by=20, urlprefix=None,urlnames=urlnames):
        if isinstance(queryset, QuerySet):
            self.queryset = queryset
        else:
            self.queryset = QuerysetWrapper(queryset)
        self.paginate_by = paginate_by
        self.request = request
        if urlprefix == None and request:
            newurl = re.sub(r'page=\d*', '', self.request.get_full_path())
            self.urlprefix = newurl
        else:
            self.urlprefix = urlprefix
        self.urlname = urlnames
        self.pageno = pageno
        
        paginator = Paginator(self.queryset, paginate_by)
        
        lastpage = math.ceil(1.0*paginator.count/paginate_by)
        
        if self.request and not pageno:
            try:
                page = self.request.GET['page']
            except:
                try:
                    page = self.request.POST.get('page','1')
                except:
                    page = self.pageno
        else:
            page = self.pageno
        try:
            if isinstance(page, str):
                if not page.isdigit():
                    page = 'last'
                    page = lastpage
            page = int(page)
            if page > lastpage:
                page = lastpage
                
            object_list = paginator.page(page).object_list
        except (InvalidPage, ValueError):
            object_list = []
        self.is_paginated = paginator.count > 1
        self.results_per_page = paginate_by
        try:
            self.has_next = paginator.page(page).has_next()
            self.has_previous = paginator.page(page).has_previous()
        except:
            self.has_next = False
            self.has_previous = False
        
        self.page = page
        self.next = page + 1
        self.previous = page - 1
        self.pages = paginator.count
        self.hits = paginator.num_pages
        self.object_list = object_list
        
        
    def next_url(self):
        if self.has_next:
            return '<a href="%spage=%d">%s</a>' % (self.fix_url(self.urlprefix), self.next, self.urlname['next'])
        return ''
        
    def previous_url(self):
        if self.has_previous:
            return '<a href="%spage=%d">%s</a>' % (self.fix_url(self.urlprefix), self.previous, self.urlname['previous'])
        else:
            return ''
        
    def first_url(self):
        if self.pages > 1:
            return '<a href="%spage=1">%s</a>' % (self.fix_url(self.urlprefix), self.urlname['first'])
        else:
            return ''
    
    def last_url(self):
        if self.pages > 1:
            return '<a href="%spage=%d">%s</a>' % (self.fix_url(self.urlprefix), self.pages, self.urlname['last'])
        else:
            return ''
        
    def fix_url(self, url):
        if url.find('?') == -1:
            url = url + '?'
        else:
            if not url.endswith('&') and not url.endswith('?'):
                url = url + '&'
        return url
    
    def page_url(self):
        """
        create page link url 
        exmple: <div><a href="group?page=2">2</a></div>
        """
        start_num = 1
        end_num = 1
        page_url = u''
        page_pre = u''
        page_last = u''
        #总页数小于等于显示分页数
        if self.hits <= 10:
            end_num = self.hits
         
        if self.hits > 10:
            if self.page-8 >=0:
                page_pre = u'<a href="%(href)spage=1">1</a><a href="%(href)spage=2">2</a>...' % {'href':self.fix_url(self.urlprefix)}
                start_num = self.page - 3
            if self.page+6 <= self.hits:
                page_last = u'..<a href="%(href)spage=%(self.page_pre)d">%(self.page_pre)d</a><a href="%(href)spage=%(self.page)d">%(self.page)d</a>' % {'href':self.fix_url(self.urlprefix),'self.page_pre':self.hits-1,'self.page':self.hits}
                
                if page_pre:
                    end_num = self.page + 3
                       
                else:
                    end_num = 8
            else:
                
                end_num = self.hits
                #start_num = self.page - 8
        page_url += page_pre   
        for n in range(start_num, end_num+1):
            if n == self.page:
                page_url += u'<a href="%(href)spage=%(self.page)d" class="current">%(self.page)d</a>' % {'href':self.fix_url(self.urlprefix),'self.page':n}    
            else:
                page_url += u'<a href="%(href)spage=%(self.page)d">%(self.page)d</a>' % {'href':self.fix_url(self.urlprefix),'self.page':n}     
        
        #设置上一页
        if self.page >1:
            page_url = u'<a href="%(href)spage=%(self.page)d">上一页</a>' % {'href':self.fix_url(self.urlprefix),'self.page':self.page-1} + page_url   
        if self.page < self.hits:
            page_last += u'<a href="%(href)spage=%(self.page)d">下一页</a>' % {'href':self.fix_url(self.urlprefix),'self.page':self.page+1}     
        page_url = u'<div class=page_list>'+ page_url + page_last + '</div>'
        if self.hits <=1:
            return ''
        return page_url
    
    def english_page_url(self):
        """
        create page link url 
        exmple: <div><a href="group?page=2">2</a></div>
        """
        start_num = 1
        end_num = 1
        page_url = u''
        page_pre = u''
        page_last = u''
        #总页数小于等于显示分页数
        if self.hits <= 10:
            end_num = self.hits
         
        if self.hits > 10:
            if self.page-8 >=0:
                page_pre = u'<li><a href="%(href)spage=1">1</a></li><li><a href="%(href)spage=2">2</a></li><li>...</li>' % {'href':self.fix_url(self.urlprefix)}
                start_num = self.page - 3
            if self.page+6 <= self.hits:
                page_last = u'<li>...</li><li><a href="%(href)spage=%(self.page_pre)d">%(self.page_pre)d</a></li><li><a href="%(href)spage=%(self.page)d">%(self.page)d</a></li>' % {'href':self.fix_url(self.urlprefix),'self.page_pre':self.hits-1,'self.page':self.hits}
                
                if page_pre:
                    end_num = self.page + 3
                       
                else:
                    end_num = 8
            else:
                
                end_num = self.hits
                #start_num = self.page - 8
        page_url += page_pre   
        for n in range(start_num, end_num+1):
            if n == self.page:
                page_url += u'<li class=on><a href="%(href)spage=%(self.page)d">%(self.page)d</a></li>' % {'href':self.fix_url(self.urlprefix),'self.page':n}    
            else:
                page_url += u'<li><a href="%(href)spage=%(self.page)d">%(self.page)d</a></li>' % {'href':self.fix_url(self.urlprefix),'self.page':n}     
        
        #设置上一页
        if self.page >1:
            page_url = u'<li ><a href="%(href)spage=%(self.page)d">Prev</a></li>' % {'href':self.fix_url(self.urlprefix),'self.page':self.page-1} + page_url   
        if self.page < self.hits:
            page_last += u'<li ><a href="%(href)spage=%(self.page)d">Next</a></li>' % {'href':self.fix_url(self.urlprefix),'self.page':self.page+1}     
        page_url = u'<div class="jx_page1"><ul>'+ page_url + page_last + '</ul></div>'
        if self.hits <=1:
            return ''
        return page_url

    def english_page_ajax_url(self,action='list'):
        """
        create page link url 
        exmple: <div><a href="group?page=2">2</a></div>
        """
        start_num = 1
        end_num = 1
        page_url = u''
        page_pre = u''
        page_last = u''
        #总页数小于等于显示分页数
        if self.hits <= 10:
            end_num = self.hits
         
        if self.hits > 10:
            if self.page-8 >=0:
                page_pre = u'<li><a onclick="go(\'%(action)s\',1)" href="javascript:void(0)">1</a></li><li><a onclick="go(\'%(action)s\',2)" href="javascript:void(0)">2</a></li><li>...</li>' % {'action':action}
                start_num = self.page - 3
            if self.page+6 <= self.hits:
                page_last = u'<li>...</li><li><a onclick="go(\'%(action)s\',%(self.page_pre)d)" href="javascript:void(0)">%(self.page_pre)d</a></li><li><a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">%(self.page)d</a></li>' % {'action':action,'self.page_pre':self.hits-1,'self.page':self.hits}
                
                if page_pre:
                    end_num = self.page + 3
                       
                else:
                    end_num = 8
            else:
                
                end_num = self.hits
                #start_num = self.page - 8
        page_url += page_pre   
        for n in range(start_num, end_num+1):
            if n == self.page:
                page_url += u'<li class="on"><a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">%(self.page)d</a></li>' % {'action':action,'self.page':n}    
            else:
                page_url += u'<li><a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">%(self.page)d</a></li>' % {'action':action,'self.page':n}     
        
        #设置上一页
        if self.page >1:
            page_url = u'<li><a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">Prev</a></li>' % {'action':action,'self.page':self.page-1} + page_url   
        if self.page < self.hits:
            page_last += u'<li><a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">Next</a></li>' % {'action':action,'self.page':self.page+1}     
        page_url = u'<div class="jx_page1"><ul>'+ page_url + page_last + '</ul></div>'
        if self.hits <=1:
            return ''
        return page_url
    
    def page_ajax_url(self, action='list'):
            """
            create page link url 
            exmple: <div><a href="group?page=2">2</a></div>
            <a onclick="go(\'%(action)s\',3)" href="javascript:void(0)">3</a>
            """
            start_num = 1
            end_num = 1
            page_url = u''
            page_pre = u''
            page_last = u''
            #总页数小于等于显示分页数
            if self.hits <= 10:
                end_num = self.hits
             
            if self.hits > 10:
                if self.page-8 >=0:
                    page_pre = u'<a onclick="go(\'%(action)s\',1)" href="javascript:void(0)">1</a><a onclick="go(\'%(action)s\',2)" href="javascript:void(0)">2</a>...' % {'action':action}
                    start_num = self.page - 3
                if self.page+6 <= self.hits:
                    page_last = u'..<a onclick="go(\'%(action)s\',%(self.page_pre)d)" href="javascript:void(0)">%(self.page_pre)d</a><a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">%(self.page)d</a>' % {'action':action,'self.page_pre':self.hits-1,'self.page':self.hits}
                    
                    if page_pre:
                        end_num = self.page + 3
                           
                    else:
                        end_num = 8
                else:
                    
                    end_num = self.hits
                    #start_num = self.page - 8
            page_url += page_pre
            for n in range(start_num, int(end_num)+1):
                if n == self.page:
                    page_url += u'<a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)" class="current">%(self.page)d</a>' % {'action':action,'self.page':n}    
                else:
                    page_url += u'<a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">%(self.page)d</a>' % {'action':action,'self.page':n}     
            
            # 设置上一页
            if self.page >1:
                page_url = u'<a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">上一页</a>' % {'action':action,'self.page':self.page-1} + page_url   
            if self.page < self.hits:
                page_last += u'<a onclick="go(\'%(action)s\',%(self.page)d)" href="javascript:void(0)">下一页</a>' % {'action':action,'self.page':self.page+1}     
            page_url = u'<div class=page_list>'+ page_url + page_last + '</div>'
            if self.hits <=1:
                return ''
            return page_url   

猜你喜欢

转载自blog.csdn.net/z_x_xing_/article/details/79668193