Как сохранить параметры запроса во время разбивки на страницы с помощью webhelpers.paginate - PullRequest
2 голосов
/ 05 октября 2009

Я смотрю пример разбиения на страницы из http://rapidprototype.ch/bg2docs/tg2pagination.html для моего проекта Turbogears 2, и он отлично работает, но у меня проблема с параметрами моего запроса при изменении страницы, которую я ищу.

Это то, что у меня есть в моем контроллере при перечислении.

def list(self, page=1, **kw):
    q = ""

    if kw.has_key('q'):
        log.debug("searching %s" % kw)
        q = kw['q']

    if kw.has_key('all'):
        q = ""

    products = DBSession.query(model.Product).filter(
        or_(model.Product.name.like('%%%s%%' % q),
            model.Product.description.like('%%%s%%' % q),
            model.Product.model.like('%%%s%%' % q),
            model.Product.code.like('%%%s%%' % q))).all()

    def get_link(product):
        return Markup("""<a href="form?id=%s">%s</a>""" % (product.id, product.id))

    product_fields = [
        (Markup("""<a href="?s=id">Id</a>"""), get_link),
        (u'Name', 'name'),
        (u'Model', 'model'),
        (u'Code', 'code'),
        (u'Description', 'description')]

    product_grid = MyDataGrid(fields = product_fields)

    currentPage = paginate.Page(products, page, items_per_page=50)

    return dict(currentPage=currentPage, 
        title=u'Products List', item=u'product', items=u'products',
        data=currentPage.items, 
        grid=product_grid,
        page=u'Search %s results' % q,
        q=q,
        hits=len(products))

Это фрагмент шаблона HTML

<h1>List of ${items}</h1>
<form action="list" method="get">
   <input name="q" type="text" value="${value_of('q', default='')}"/>
   <input type="submit" value="Search"/> <input type="submit" name="all" value="All"/>
</form>
${hits} ${items} found
<p class="pagelist">${currentPage.pager(format='$link_first ~3~ $link_last')}</p>
<div>
  ${grid(data)}
</div>
<p><a href="${tg.url('form')}">Add a ${item}</a></p>

Поиски работают нормально, в результате чего появляются ссылки типа ' / list? Q = cable ', но когда я нажимаю на некоторые страницы с нумерацией страниц, "1,2 ... 8,9" превращается в ' / список? страница = 2

Как добавить предыдущий параметр запроса или любые другие параметры в ссылку?

Ответы [ 3 ]

1 голос
/ 19 октября 2009

вы должны использовать синтаксис вроде:

currentPage.kwargs['q'] = q

currentPage = paginate.Page(
                            products,
                            page,
                            items_per_page=50,
                            q = q
)
1 голос
/ 05 октября 2009

После экспериментов с оболочкой я думаю, что нашел решение.

Есть словарь kwargs, определенный в currentPage (после назначения из paginate.Page), поэтому я провел несколько экспериментов, посылая параметры, и это сработало. Вот как.

currentPage = paginate.Page(products, page, items_per_page=50)

currentPage.kwargs['q'] = q

return dict(currentPage=currentPage, 
    title=u'Products List', item=u'product', items=u'products',
    data=currentPage.items, 
    grid=product_grid,
    page=u'Search %s results' % q,
    q=q,
    hits=len(products))

теперь я получаю ссылки такого типа: ' / list? Q = cable & page = 2 ' все еще задаюсь вопросом, является ли это лучшим решением или лучшей практикой

0 голосов
/ 24 мая 2012

вы можете обновить параметры запроса, как это фрагменты.

def paginate(self, items, items_per_page=20):
    """https://bitbucket.org/bbangert/webhelpers/src/acfb17881c1c/webhelpers/paginate.py"""

    current_page = self.request.GET.get('page') or 1

    def page_url(page):
        params = self.request.params.copy()
        params['page'] = page
        return self.request.current_route_url(_query=params)

    return Page(collection=items, page=current_page, items_per_page=items_per_page, url=page_url)
...