Django Pagination - Paginação fácil no Django
Estava eu, rodando pela internet no site da comunidade oficial do django quando me deparei com dois novos screencasts nesse site, e como sou bem curioso fui olhar.
O primeiro nem me chamou muito a atenção, a não ser pelo nível de organização do cara que é bastante interessante, porém no segundo ele apresentou uma aplicação chamada django-pagination, que torna muito fácil fazer paginação utilizando o framework django.
A utilização da mesma se dá de maneira bem fácil e é sobre isso que vou discorrer neste artigo, de acordo com as alterações que o autor do artigo original citou no screencast.
01 - Instalando a django-pagination para ser usada em todos os projetos;
Como feito no primeiro screencast (que citei o site acima) eu instalei a django-pagination junto com o meu django e em seguida linkei para o site-packages para poder ser usada em qualquer projeto, vamos então aos passos:
a) Baixe o source do google-source pelo SVN:
# cd /var/www/apps/python/
svn checkout http://django-pagination.googlecode.com/svn/trunk/ django-pagination
Logo após terminar, registre no site-packages do seu sistema, como eu uso o Archlinux, e sendo ele um *nix que suporta bash… resolvi usar o script pylink citado pelo autor para fazê-lo de maneira mais prática:
b) Crie o script em um arquivo chamado pylink:
pylink
#!/bin/bash
ln -s `pwd`/$1 `python -c “from distutils.sysconfig import get_python_lib; print get_python_lib()”`/$1
c) Dê permissão para que os usuários possam utilizá-lo:
# chmod 755 pylink
Aqui no Archlinux eu também linkei ele para uma pasta de binários locais que eu utilizo:
# ln -s `pwd`/pylink /usr/local/bin/pylink
d) Agora é só utilizá-lo para adicionar o pagination no site-packages do seu sistema:
# cd django-pagination/
# pylink pagination
Com o django-pagination instalado podemos então modifcar o projeto:
02 - Alterando o arquivo settings.py do projeto;
Primeiramente é preciso adicionar os TEMPLATES_CONTEXT_PROCESSORS logo embaixo das MIDDLEWARE_CLASSES no arquivo settings.py do projeto no qual estaremos instalando a aplicação django-pagination:
settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
“django.core.context_processors.auth”,
“django.core.context_processors.debug”,
“django.core.context_processors.i18n”,
“django.core.context_processors.media”,
“django.core.context_processors.request”,
)
Logo após também é necessário adicionar a aplicação pagination no seu settings.py:
settings.py
INSTALLED_APPS = (
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.sites’,
‘django.contrib.admin’,
‘twitter’,
‘pagination’,
)
E, em seguida adicionar o middleware da aplicação também no arquivo settings.py do projeto:
settings.py
MIDDLEWARE_CLASSES = (
‘django.middleware.common.CommonMiddleware’,
‘django.contrib.sessions.middleware.SessionMiddleware’,
‘django.contrib.auth.middleware.AuthenticationMiddleware’,
‘django.middleware.doc.XViewMiddleware’,
‘pagination.middleware.PaginationMiddleware’,
)
Por incrível que pareça não é necessário alterar nada nos models nem nas views do projeto e simplesmente alterando o templete conseguimos implementar a paginação utilizando a django-pagination.
03 - Alterando o template:
As alterações no template consistem em:
a) Adicionar a tag {% load pagination_tags %} no topo do template:
public.html
{% load pagination_tags %}
<html>
b) Adicionar a tag {% autopaginate v n %} antes do loop que vai preencher a página. Onde v é a variável que contém os registros que vamos carregar no loop e n é o número de registros que queremos exibir por página, sendo o n padrão igual a 20. Segue um exemplo:
public.html
{% autopaginate tweets 10 %}
{% for tweet in tweets %}
<p><b>{{ tweet.user.username }}</b> said: {{ tweet.message }}</p>
{% endfor %}
c) Adicionar a tag {% paginate %} logo após o loop, para aparecer o rodapé de navegação na página:
public.html
{% autopaginate tweets 10 %}
{% for tweet in tweets %}
<p><b>{{ tweet.user.username }}</b> said: {{ tweet.message }}</p>
{% endfor %}
{% paginate %}
E vualá, você terá 10 registros sendo exibidos por página…
Você pode se perguntar: Eu estou carregando todos os registros para somente apresentar 10 por vez, e vou recarregar toda vez que eu mudar de página? Isso vai ficar muito lento!
Exatamente, se você adicionar a tag {% autopaginate v n %} antes do seu loop só serão carregados os registros dá página em que você estará navegando. Então segundo as palavras do próprio autor: Você não precisa nem hesitar em não usar a django-pagination em seus projetos.
Obrigado pela atenção e até a próxima.
3 Comentários »
Deixe um comentário
About
Leandro Pincini:
Quase formado Tecnólogo em Processamento de Dados pela Faculdade de Tecnologia (FATEC) de Taquaritinga. Sim, estou naquela faze chata de final de curso em que temos que escrever nossas monografias.
Áreas de interesse:
Arch Linux, Programação (Java, Python, Ruby), Tecnologia.
Prezado,
Pelo que eu entendi essa paginação não carrega todos os registros. Mas se não altera a view, então são buscados todos os registros no banco, armazenados em uma variável do python e então essa variável é passada para o template. No template, o django-pagination filtra apenas 10 registros e envia para o computador do cliente.
Isso não geraria uma sobrecarga no banco não? Ou realmente só busca no banco os 10 registros?
Se puder me responder por e-mail ou pelo menos me avisar que respondeu, eu agradeço.
Abs.
Apesar de conhecer PHP e Ruby, e os frameworks CakePHP e Rails, além de Python, só agora estou começando a mexer no Django. E essa aplicação ‘paginate’ já foi uma mão na roda logo de cara. Interessante como a aplicação é facilmente plugável, alterando apenas o template. =]
Você pode se perguntar: Eu estou carregando todos os registros para somente apresentar 10 por vez, e vou recarregar toda vez que eu mudar de página? Isso vai ficar muito lento!
Exatamente, se você adicionar a tag {% autopaginate v n %} antes do seu loop só serão carregados os registros dá página em que você estará navegando. Então segundo as palavras do próprio autor: Você não precisa nem hesitar em não usar a django-pagination em seus projetos.