Cómo mantener los parámetros de consulta durante la paginación con webhelpers.paginate
-
19-09-2019 - |
Pregunta
busco un ejemplo de la paginación de http://rapidprototype.ch/bg2docs/tg2pagination.html para mi proyecto TurboGears 2 y funciona muy bien, pero tengo un problema con respecto a mis parámetros de consulta cuando cambio la página que estoy buscando.
Esto es lo que tengo en mi controlador cuando se enumeran.
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))
Este es el fragmento de plantilla 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>
Las búsquedas funciona bien resulta en enlaces como este ' / lista? Q = Cable ', pero cuando hago clic en algunas de las páginas paginar "1,2 ... 8,9" vuelve a ' / lista? page = 2
¿Cómo agrego mi parámetro de consulta previa o cualquier otro parámetro al enlace?
Solución
Después de experimentar en la cáscara por un tiempo creo que he encontrado una solución.
Hay un diccionario kwargs definido en currentPage (después de haber sido asignado a paginate.Page), así que hice algunos experimentos envío de parámetros y funcionó. Esta es la forma.
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))
Ahora me sale este tipo de enlaces: ' / lista de q = Cable & page = 2 ?' Todavía se pregunta si es la mejor solución o la las mejores prácticas
Otros consejos
se debe utilizar una sintaxis como:
currentPage.kwargs['q'] = q
currentPage = paginate.Page(
products,
page,
items_per_page=50,
q = q
)
puede actualizar petición params, similares a este fragmentos.
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)