2009-10-05 7 views
2

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

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

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> 

Обыски отлично работает в результате ссылки, как этот «/список? Д = кабель», но когда я нажимаю некоторые из Разбиение страниц «1 , 2 ... 8,9 "превращается в '/list? Page = 2'

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

ответ

1

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

Существует словарь 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)) 

теперь я получаю этот вид связи: «? /список д = кабель & страница = 2» еще интересно, если это лучшее решение или лучшие практики

+0

Это доказало свою эффективность до настоящего времени, не нашли никакой документации относительно этого или любого другого метода, я буду отмечать его как правильный ответ. – Juparave

1

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

currentPage.kwargs['q'] = q 

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

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

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)