Djangoのページ付け
Djangoはページング用のクラスPaginatorを提供しますが、Paginatorは特定のページの処理を具体的に管理するのではなく、Pageオブジェクトを使用して特定のページを管理します。以下では、特定の例を使用して、ページングの実装を説明します。
記事モデル:
class Articles(models.Model):
tid = models.AutoField(primary_key=True)
cid = models.ForeignKey('Category', models.DO_NOTHING, db_column='cid', blank=True, null=True)
description = models.CharField(max_length=300)
title = models.CharField(max_length=255)
content = models.CharField(max_length=20000, blank=True, null=True)
author = models.CharField(max_length=255, blank=True, null=True)
pub_date = models.DateTimeField()
replycount = models.IntegerField(blank=True, null=True)
hits = models.IntegerField()
isdeleted = models.IntegerField()
noreply = models.IntegerField(blank=True, null=True)
iscreator = models.IntegerField(blank=True, null=True)
isrecommend = models.IntegerField(blank=True, null=True)
tags = models.CharField(max_length=255, blank=True, null=True)
class Meta:
db_table = 'articles'
表のデータ:
ポケットベルオブジェクト
形式: Paginator(<query_set query set>、各ページに表示されるデータの数)
-
オブジェクトのプロパティ
ページングオブジェクトの数を数える
num_pages合計ページ数
ページ番号のpage_rangeリスト
-
方法
page(num)はページオブジェクトを返し、指定されたページ番号が存在しない場合は例外をスローします
コード例:
# 需要导入Paginator类
from django.core.paginator import Paginator
pagination = Paginator(articles,10)
ページオブジェクト
ページオブジェクトは、各ページのデータ、現在のページのページ番号、前のページか次のページかなど、各ページの処理を特に担当します。
カテゴリー | 名前 | 説明 |
---|---|---|
属性 | object_list | 現在のページ番号のすべてのデータ |
属性 | 数 | 現在のページ番号の値 |
属性 | ページネーション | Paginatorのオブジェクトを返します |
方法 | has_next | 次のページはありますか |
方法 | has_previous | 前のページがあるかどうか |
方法 | has_other_pages | 前のページか次のページがあるか |
方法 | next_page_number | 次のページのページ番号を返す |
方法 | previous_page_number | 前のページのページ番号を返す |
方法 | len | 現在のページのデータ数を返します |
使用する:
# 由分页器对象调用page方法创建,参数是当前页码
pager = pagination.page(page)
具体例
ルーティング構成(urls.py)
from django.urls import path
from App import views
app_name = "App"
urlpatterns = [
#.....
path("list/<int:page>/",views.article_list),
]
ビュー(views.py)
# views.py
def article_list(request,page=1):
articles = Articles.objects.all()
# 实例化分页对象,一页两条记录
pagination = Paginator(articles,10)
page = pagination.page(page) #某一页的分页对象
return render(request,'userlist.html',locals())
フロントエンドページ(list.html)
ブートストラップスタイルが使用されます
<!-- 部分代码 -->
<div class="page-box layui-row">
<div id="pageItem">
<nav aria-label="Page navigation">
<ul class="pagination">
{# 判断是不是有前一页 #}
{% if pager.has_previous %}
<li>
<a href="/list/{
{ pager.previous_page_number }}/" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% else %}
{# 如果没有前一页 禁止点击前一页 #}
<li class="disabled">
<a href="/list/{
{ page }}/" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
{% endif %}
{# 循环生成页码, page_range是一个整数页码列表 #}
{% for cur in pagination.page_range %}
{# 判断是不是当前页,如果是高亮显示 #}
{% if cur == page %}
<li class="active"><a href="/list/{
{ cur }}/">{
{ cur }}</a></li>
{% else %}
<li><a href="/list/{
{ cur }}/">{
{ cur }}</a></li>
{% endif %}
{% endfor %}
{# 判断是不是有下一页 #}
{% if pager.has_next %}
<li>
<a href="/list/{
{ pager.next_page_number }}/" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
{% else %}
<li class="disabled">
<a href="/list/{
{ page }}/" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
{% endif %}
</ul>
</nav>
</div>
</div>
最終効果: