Djangoページネーションの実装

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>

最終効果:

おすすめ

転載: blog.csdn.net/chengshaolei2012/article/details/113900841