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.

11 Responses to Django Pagination – Paginação fácil no Django

  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.

  2. Henrique says:

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

  3. pognation says:

    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.

  4. André Gadonski says:

    Você conseguiu colocar a paginação em portugues?

  5. pognation says:

    Sem gambiarra? Não.

  6. André Gadonski says:

    hahaha

    como você fez? Talvez vou ter que apelar pra POG ( programação orientada a gambiarras)

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

  8. Alisson says:

    O exemplo do tutorial é o que foi feito no video tutorial do showmedo.com/tutorials/

    Mas realmente é uma mão na roda.

  9. salatiel says:

    como faço pra traduzir?

  10. Jose says:

    Será que corre no google Apps Engine?

  11. timoteoramos says:

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

Deixe um comentário