GAE Django Table Records Нумерация страниц? - PullRequest
0 голосов
/ 09 марта 2010

У кого-нибудь есть предложения или пример того, как отображать таблицу записей Google Datastore с нумерацией страниц в шаблоне django Google App Engine? Что-то вроде пагинации Gmail.

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

Я написал этот класс сегодня:)

class gaePaginator ():
    leftPages           = 3
    rightPages          = 3
    centerPages         = 1
    totalPages          = 1
    baseURL             = 'http://example.com/%s/'
    moveLeft            = '<'
    moveLeftmax         = '<<'
    moveRight           = '>'
    moveRightmax        = '>>'
    href                = '<a href="%s">%s</a>'
    currentPageWrap     = '<b>%s</b>'
    textBetween         = '...'
    separator           = ' '
    currentPage         = 1


    """
    Ranges for current page
    """
    def leftRange(self):
        return range(1, self.leftPages+1)
    def rightRange(self):
        return range (self.totalPages - self.rightPages+1, self.totalPages + 1)
    def centerRange(self):
        return range(self.currentPage - self.centerPages, self.currentPage + self.centerPages + 1)

    def renderLeftNav(self):
        """
        Method render left page nav tab like <<(move to first page) <(move to previous page).
        """
        result = []
        if self.currentPage <= 1  or self.currentPage > self.totalPages:
            # draw nothing
            pass
        elif self.currentPage == 2:
            #draw only arrow for previous page
            arrow = self.href % (self.baseURL % 1, self.moveLeft)
            result.append(arrow)
        else:
            #draw arrow for previous page and first page
            arrow = self.href % (self.baseURL % 1, self.moveLeftmax)
            result.append(arrow)
            arrow = self.href % (self.baseURL % (self.currentPage - 1), self.moveLeft)
            result.append(arrow)
        return self.separator.join(result)

    def renderRightNav(self):
        """
        Method render left page nav tab like "<<(move to first page) <(move to previous page)"
        """
        result = []
        if self.currentPage >= self.totalPages or self.currentPage < 1:
            #draw nothing
            pass
        elif self.currentPage == self.totalPages - 1:
            #draw only arrow for next page
            arrow = self.href % (self.baseURL % self.totalPages, self.moveRight)
            result.append(arrow)
        else:
            #draw arrow for next page and for last page
            arrow = self.href % (self.baseURL % (self.currentPage + 1), self.moveRight)
            result.append(arrow)

            arrow = self.href % (self.baseURL % self.totalPages, self.moveRightmax)
            result.append(arrow)
        return self.separator.join(result)

    def getRange (self):
        result = []
        for i in range(1, self.totalPages+1):
            if i in self.leftRange() or i in self.rightRange() or i in self.centerRange():
                result.append(i)
            else:
                if result[-1] is not None:
                    result.append(None)
        return result

    def renderPageRange (self):
        '''
        Method returns list of pages as urls in HTML representation.
        '''
        result = []
        for i in self.getRange():
            if i == self.currentPage:
                tmp = self.currentPageWrap % i
            else:
                if i is None:
                    tmp = self.textBetween
                else:
                    tmp = self.href % (self.baseURL % i, i)
            result.append(tmp)
        return self.separator.join(result)

    def asURL(self):
        '''
        Method returns list of pages as urls in HTML representation with border arrows.
        '''
        result = []
        result.append(self.renderLeftNav())
        result.append(self.renderPageRange())
        result.append(self.renderRightNav())
        return self.separator.join(result)

Использование в views.py:

from ....main.paginator import gaePaginator  
pages = gaePaginator ()
pages.currentPage   = pagesNumber
pages.leftPages     = 2 
pages.rightPages    = 2
pages.centerPages   = 1
pages.totalPages    = totalPagesNumber
pages.baseURL       = 'page/%s'
pages.separator     = '&nbsp;&nbsp;'
result = {'pages'         : pages.asURL(),}

используя в шаблоне:

{{ pages }}

в результате вы получите: для десяти страниц

текущая страница 1: 1 2 ... 9 10> >>

текущая страница 4: << <1 2 3 <strong>4 5 ... 9 10> >>

текущая страница 6: << <1 2 ... 5 <strong>6 7 ... 9 10> >>

текущая страница 10: << <1 2 ... 9 <strong>10

<< - moves to first page
< - moves to previous page
> - moves to next page
>> - move to last page

также этот код пытается рисовать страницы для любого случая: например, если пользователь установит номер страницы = -1 или будет отображаться 100000 «1 2 ... 9 10».

также он может быть использован в шаблоне, как Django Paginator, но я не пытался это сделать.

0 голосов
/ 11 октября 2010

Для тех, кто ищет простую нумерацию страниц в Google App Engine, попробуйте:

http://appengine -cookbook.appspot.com / рецепт / простой пагинация-djangocorepaginator /

0 голосов
/ 30 марта 2010

Эта страница, вероятно, отвечает на ваш вопрос: http://code.google.com/appengine/articles/paging.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...