Melhore a eficiência e a escalabilidade do seu aplicativo Django implementando a paginação. Aqui está tudo o que você precisa saber para começar.
A paginação melhora a experiência do usuário e o desempenho do aplicativo ao lidar com grandes conjuntos de dados. Sem um sistema de paginação instalado, seu aplicativo ficará lento na maior parte do tempo. Com o Django, você pode aproveitar o suporte interno para paginação para paginar seu aplicativo da web.
Como funciona a paginação no Django
A implementação da paginação no Django pode diferir dependendo se você trabalha com visualizações baseadas em classe ou baseadas em função. Independentemente do seu método preferido, os princípios subjacentes permanecem os mesmos.
Django usa uma classe chamada paginador para implementar a paginação. O paginador A classe fornece vários métodos que você pode usar para personalizar sua paginação. Ao inicializar o paginador classe, leva dois parâmetros obrigatórios; os dados para paginar e o número de itens para mostrar por página. O
paginador recebe um terceiro parâmetro opcional para órfãos para especificar o número mínimo de itens que devem permanecer na última página. Por padrão, o valor de órfãos é 0, o que significa que todas as páginas têm o mesmo número de itens.A URL para uma página paginada do Django é semelhante a esta: https://example.com/products/?page=3. O página O parâmetro na URL informa ao Django qual página o usuário deseja ver. Também ajuda o Django a determinar qual parte dos dados exibir para aquela página.
O código utilizado neste projeto está disponível em um Repositório GitHub e é gratuito para você usar sob a licença do MIT.
Configure seu projeto Django para paginação
Antes de paginar no Django, você deve ter instalei o Django e configurei no seu computador. Depois de configurar o Django em seu computador, você deve criar um aplicativo e um modelo para seus dados. Aqui está um modelo simples que você pode copiar:
de django.db importar modelos
aulaPublicar(modelos. Modelo):
título = modelos. CharField (max_length=255)
autor = modelos. CharField (max_length=50)
conteúdo = modelos. Campo de texto('Publicar conteúdo')
def__str__(auto):
retornar self.title
O modelo acima é para um aplicativo de blog. Ele define os campos de título, autor e conteúdo para cada postagem do blog. Ele também possui um método que retorna o título do post para uma melhor experiência do usuário no painel de administração.
Migre seu modelo executando este comando:
python manage.py makemigrations && python manage.py migrar
Depois de migrar seu modelo, você deve navegar para blog>admin.py para registrá-lo. O código a seguir registra com êxito um modelo chamado Publicar.
de django.contrib importar administrador
de .modelos importar Publicar # substitua 'Post' pelo nome do seu modelo
admin.site.register (Post)
Em seguida, crie um superusuário e adicione postagens em seu painel de administração do Django. Para criar um superusuário, use este comando:
python manage.py createsuperuser
O comando acima o guiará pelo processo ilustrado na imagem abaixo:
Depois de criar um superusuário, execute seu servidor de desenvolvimento e navegue até o painel de administração.
python manage.py runserver
Depois que o servidor iniciar, navegue até http://127.0.0.1:8000/admin, faça login e adicione algumas postagens.
Em seguida, crie um modelo HTML para renderizar suas postagens no navegador. Crie seu arquivo no seguinte diretório: your_app/templates/your_app_name/index.html. Se você não entende como criar modelos, leia nosso guia introdutório à arquitetura MVT do Django.
Paginação Django em uma visão baseada em função
O Django permite que você crie aplicativos com visualizações baseadas em classes ou visualizações baseadas em funções. Para paginar seu aplicativo usando uma exibição baseada em função. Siga esses passos:
- Abre o teu views.py arquivo e importar o paginador aula.
de django.core.paginator importar paginador
- Crie uma função de exibição para renderizar postagens em seu modelo HTML.
de django.shortcuts importar renderizar
de .modelos importar Publicar
de django.core.paginator importar paginador
defexibição de lista(solicitar):
posts = Post.objects.all()
retornar renderizar (solicitação, 'blog/blog_list_view.html', {'Postagens':Postagens})
- Crie um padrão de URL para mostrar suas postagens no navegador. Comece configurando o padrão de URL no diretório do seu projeto. Abra o urls.py arquivo no nível do projeto e adicione-o ao urlpadrões:
de django.urls importar incluir
urlpadrões = [
...,
caminho('', incluir('blog.urls')),
]
No trecho de código acima, substitua blogue com o nome do seu aplicativo. Se você não consegue diferenciar entre um projeto e um aplicativo, você deve saber como um projeto difere de um aplicativo no Django.
Depois de fazer a configuração acima, crie um urls.py arquivo no diretório do seu aplicativo (neste caso, é o blogue pasta) e adicione este trecho de código:
de django.urls importar caminho
de .Visualizações importar exibição de lista
urlpadrões = [
caminho('', list_view, nome='exibição de lista'),
]
Quando você executa seu servidor e navega para http://127.0.0.1:8000/, o navegador exibirá suas postagens de acordo com sua folha de estilo especificada.
- Modifique sua função de exibição para adicionar lógica de paginação. Aqui está um exemplo:
defexibição de lista(solicitar):
posts = Post.objects.all()
paginado = Paginador (postagens, 3)
page_number = solicitação. GET.get('página') #Obtenha o número da página solicitada da URL
página = paginada.get_page (page_number)
retornar renderizar (solicitação, 'blog/blog_list_view.html', {'página':página})
O trecho de código acima apresenta três novas variáveis: paginado, número de página, e página. Cada variável faz o seguinte:
- O paginado variável inicializou o paginador aula. Nesse cenário, os dados a serem paginados são o conjunto de consultas, Postagens, e é preciso 3 como o número de itens a serem exibidos por página.
- O número de página variável obtém o número da página do URL. Por exemplo, em http://127.0.0.1:8000/?page=2, o número da página é 2.
- O página variável recupera a página específica para renderizar a partir do paginado variável.
Até agora, o Django deve ter paginado sua página. Você pode navegar para páginas paginadas específicas usando o formato de URL mostrado nesta imagem:
- Modifique seu modelo HTML para exibir a navegação para páginas paginadas. Usando métodos disponíveis no paginador classe permite que você crie uma navegação simples em sua página. Aqui está um exemplo que você pode adicionar abaixo do seu código HTML inicial:
{% if page.has_previous %}
<ahref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">Anteriora>
{% fim se %}<ahref="?página=1"aula="btn btn-secundário">Primeiroa>
{% para num em page.paginator.page_range %}
{% if num == page.number %}
<período>{{ num }}período>
{% outro %}
<ahref="?página={{num}}"aula="btn btn-secundário mx-2">
{{ num }}
a>
{% fim se %}
{% endfor %}<ahref="?page={{page.paginator.num_pages}}"aula="btn btn-secundário mx-2">
Durar
a>
{% if page.has_next %}
<ahref="?page={{page.next_page_number}}"aula="btn btn-secundário mx-2">
Próximo
a>
{% fim se %}
No trecho de código acima, os seguintes métodos são usados em conjunto com instruções condicionais para determinar como será a aparência da navegação de paginação:
- tem_anterior: Este método retorna Verdadeiro se houver uma página anterior nos dados paginados.
- número_da_página_anterior: Este método retorna o valor da página anterior.
- page_range: este método permite saber quantas páginas você tem em seus dados paginados.
- número: Este método retorna o valor da página atual.
- num_pages: este método retorna o número total de páginas.
- has_next: Esta função retorna Verdadeiro se houver uma próxima página nos dados paginados.
- next_page_number: Este método retorna o valor da próxima página.
Paginação do Django em uma visão baseada em classe
Em uma exibição baseada em classe, você não precisa importar e inicializar o paginador aula. Para implementar a paginação em uma visão baseada em classe, você deve especificar um atributo chamado paginar_por. Siga estas etapas para paginar seu aplicativo com uma exibição baseada em classe:
- Escreva uma visão baseada em classe e especifique o paginar_por atributo. Aqui está um exemplo simples:
de .modelos importar Publicar
de django.views.generic importar Exibição de lista
aulaPostListView(Exibição de lista):
modelo = postar
template_name = 'blog/blog_list_view.html'
context_object_name = 'página'
paginate_by = 2
A visão acima é a versão baseada em classe da visão baseada em função escrita anteriormente. Esta visão herda do Django Exibição de lista classe, usada para listar itens. Ele define sua lógica com atributos como modelo, template_name, context_object_name, e paginar_por. O paginar_por o atributo determina quantas postagens exibir por página; neste caso, 2 posts.
- Depois de criar sua exibição, modifique seu urls.py arquivo para usá-lo. Aqui está um exemplo simples:
de .Visualizações importar PostListView
urlpadrões = [
caminho('', PostListView.as_view(), nome='exibição de lista'),
]
- Modifique seu modelo HTML para usar page_obj para a paginação.
{% if page_obj.has_previous %}
<ahref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">Anteriora>
{% fim se %}<ahref="?página=1"aula="btn btn-secundário">Primeiroa>
{% para num in page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<períodoaula="pagina atual">{{ num }}período>
{% outro %}
<ahref="?página={{num}}"aula="btn btn-secundário mx-2">
{{ num }}
a>
{% fim se %}
{% endfor %}<ahref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-NN">
Durar
a>
{% if page.has_next %}
<ahref="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-NN">
Próximo
a>
{% fim se %}
Ao contrário do modelo HTML para a exibição baseada em função, este modelo usa page_obj em vez de página para representar o objeto de página. Este é o comportamento padrão para paginação baseada em classe no Django.
Use a paginação para tornar seu aplicativo escalável
A paginação reduz a carga em seu servidor/banco de dados buscando e exibindo subconjuntos menores de dados por vez. Com a paginação, o desempenho de seus sites aumentará. Seus usuários também terão uma boa experiência ao usar seu aplicativo.
As exibições baseadas em classe economizam mais tempo e código quando comparadas às exibições baseadas em função, mas você pode usar qualquer uma delas, dependendo de sua preferência e especificações do projeto.