Django Pagination – Paginação fácil no Django
julho 18, 2008 11 Comentários
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.
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.
Você conseguiu colocar a paginação em portugues?
Sem gambiarra? Não.
hahaha
como você fez? Talvez vou ter que apelar pra POG ( programação orientada a gambiarras)
Quando eu coloco a tag {% paginate %} no meu template da um erro …
TemplateSyntaxError at /artigos/
Caught an exception while rendering: pagination/pagination.html
Request Method: GET
Request URL: http://localhost:8000/artigos/
Exception Type: TemplateSyntaxError
Exception Value:
Caught an exception while rendering: pagination/pagination.html
Meu template está assim …
{% extends “base/base.html” %}
{% load pagination_tags %}
{% block outros %}
{% autopaginate articles 2 %}
{% for ar in articles %}
{{ ar.titulo }}
Autor: {{ ar.autor }}
{{ ar.dataCriacao|date:”d \d\e F \d\e Y” }}
{% ifequal ar.tipoartigo “R” %}
Reflexões…
{% endifequal %}
{% ifequal ar.tipoartigo “P” %}
Palestras…
{% endifequal %}
{% ifequal ar.tipoartigo “F” %}
Formação…
{% endifequal %}
{{ ar.resumo }}
Ler mais …
{% endfor %}
{% paginate %}
{% endblock %}
Alguma idéia??
POde passar o sitedo desenvolvedor ?
O exemplo do tutorial é o que foi feito no video tutorial do showmedo.com/tutorials/
Mas realmente é uma mão na roda.
como faço pra traduzir?
Será que corre no google Apps Engine?
Para customizar o layout do pagination: caso você tenha alguma pasta de templates pessoal (praticamente em todo projeto Django existe uma pasta chamada templates), basta criar um arquivo pagination/pagination.html (na biblioteca do django-pagination existe o template padrão, você pode copiar o arquivo original para a pasta do seu projeto).