Paginação no Django

Postado em: Março 15, 2008
Tags: django

Vamos falar sobre paginação de dados, algo muito usado, um exemplo de paginação esta aqui nesse blog. Ao acessar a pagina inicial você ira ver o numero de paginas e as setinhas para navegar nelas, isso foi possível graças ao ObjectPaginator, um recurso do Django para separar os dados de um objeto em paginas.
Vamos ao que interessa, vamos usar a seguinte declaração:

from django.core.paginator import ObjectPaginator

Com o ObjectPaginator importado vamos ao código, é o mesmo usado aqui nesse blog:
def index(request, pagina=None):
posts = Posts.objects.all()
paginacao = ObjectPaginator(posts, 4)
num_pagina = int(pagina)
posts_resumo = paginacao.get_page(num_pagina - 1)

return render_to_response('index.html', {'posts_resumo':posts_resumo,
'tem_proximo': paginacao.has_next_page(num_pagina - 1),
'tem_anterior': paginacao.has_previous_page(num_pagina - 1),
'pagina': num_pagina,
'proximo': num_pagina + 1,
'anterior': num_pagina - 1,
'paginas': paginacao.pages})


Bem simples, pegamos todos os dados, no caso os posts do blog e mandamos ele para o ObjectPaginator e dizemos para ele que queremos 4 posts por pagina. Convertemos o parâmetro “pagina” para um inteiro e pegamos à página informada no parâmetro.
Na passagem dos parâmetros para a página verificamos se tem próxima página ou se tem página anterior para podermos fazer filtros no template html.
Em nosso template faremos o seguinte:
{% if tem_anterior %}
<a href="/pagina/{{ anterior }}">« anterior</a>
{% else %}
« anterior
{% endif %}
| página {{ pagina }} de {{ paginas }} |
{% if tem_proximo %}
<a href="/pagina/{{ proximo }}">próximo »</a>
{% else %}
proximo »
{% endif %}

Acho que o template dispensa explicações, é bem simples, verificamos se tem paginas tanto para trás como para frente e montamos a nossa paginação.
Não podemos esquecer do urls.py, a url é bem simples:
(r'^pagina/(?P<pagina>\d+)/$', 'djblog.blog.views.index'),

Era isso, até a próxima!



Não será divulgado!

Um site válido!

Mayron em Março 16, 2008

tá de sacanagem comigo... :D
tudo o que eu estava esquecendo era esse bendito <b>(r'^pagina/(?P<pagina>\d+)/$', 'djblog.blog.views.index'),</b>
O Renato, só tinha esquecido de colocar a url... estava tudo certo... hehehehe

Elton Minetto em Março 17, 2008

Excelente dica.
Com o Django é muito simples implementar isso. Como deveria ser em qualquer linguagem/framework
:-)

Mayron em Março 18, 2008

Vai ai uma dica....
aqui em:
paginacao = ObjectPaginator(posts, 4)
vc pode usar uma constante ou até mesmo uma variável normal, para ficar trocando o tamanho da paginação, por exemplo:
T_PAGINACAO = 10
paginacao = ObjectPaginator(posts, T_PAGINACAO)

Ainda mais essa variável pode ser passada por get, assim deixando o usuário a escolha de quantos registros quer por página....
é uma idéia :D

Igor Sobreira em Março 29, 2008

Na versão em desenvolvimento saiu uma nova classe para paginação, o Paginator:

http://www.djangoproject.com/documentation/models/pagination/

eu achei que melhorou muito :-)

Rafael C. de B. em Março 29, 2008

Oi Igor!
Ultimamente tenho tido pouco tempo, mas fiquei sabendo da existência dessa nova classe, estou penando aqui com algumas coisas mas assim que me sobrar um tempo rasoavel eu farei um novo artigo abordando essas alterações no paginador e claro atualizar o blog tb pois aqui estou usando o modo antigo.
Vlw!

Francisco em Abril 5, 2008

Nossa nem conhecia esse recurso! Criei esse num projeto meu de outra maneira, contando o número de postagens. vlw pela dica

Italo Maia em Maio 7, 2008

Só avisando que o ObjectPaginator está depricado dando lugar ao Paginator que agora, usa uma classe Page e talz. Muda um pouco o código no fim das contas.

Outros

Hospedagem gratuitamente cedida pela TeHospedo - Hospedagem de sites, registro de dominios, revenda de hospedagem, streaming
TeHospedo - Hospedagem de sites, registro de dominios, revenda de hospedagem, streaming

django donated

pyconbrasil

Divulgue o Nerdson

Firefox 3 - Brazil

BlogBlogs

Add to Technorati Favorites

Django
Desenvolvido com Django, Aptana, Gimp, Inkscape | Rafael Campos de Bastiani - RFDev.org - 2008