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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top