Pognation

May the POG be with you!

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.

Julho 18, 2008 - Escrito por pognation | Django, Python, programação | , , , , , , , | 3 Comentários

3 Comentários »

  1. 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.

    Comentário de Vinicius Mendes | Julho 23, 2008

  2. 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. =]

    Comentário de Henrique | Julho 24, 2008

  3. 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.

    Comentário de pognation | Julho 26, 2008

Deixe um comentário