Django Pagination – Paginação fácil no Django

Julho 18, 2008

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.

Entry Filed under: Django, Programação, Python. Tags: , , , , .

7 Comments Add your own

  • 1. Vinicius Mendes  |  Julho 23, 2008 at 9:14 pm

    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  |  Julho 24, 2008 at 1:34 am

    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  |  Julho 26, 2008 at 5:19 pm

    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  |  Abril 29, 2009 at 12:57 am

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

  • 5. pognation  |  Abril 29, 2009 at 2:20 pm

    Sem gambiarra? Não.

  • 6. André Gadonski  |  Abril 29, 2009 at 8:08 pm

    hahaha

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

  • 7. Fred Chevitarese  |  Junho 19, 2009 at 5:05 pm

    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 ?

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


Tópicos recentes

Categorias