【Django】Pythonフレームワークでページネーションを実装していく

プログラミング初心者の勉強ブログ #97

Pythonオンライン学習教材として評判のPyQ(https://pyq.jp/)によるPython学習記録です。Rubyを多少かじり、第二外国語としてPythonを少しづつ学んでいきます。(内容はRubyとの比較が多くなるかもしれません。)

PyQのDjango初級まで終わらせたので、PythonフレーブワークであるDjangoでページネーション実装についてまとめます。

 

目次

[toc]

 

ページネーション機能

Djangoでは簡単にページネーションを実装できるPaginatorという機能があります。Productモデルで作られるプロダクトのリストをページネーションで表示します。

ページネーション

catalogue/views.py

// paginatorをインポート(EmptyPage, PageNotAnIntegerはエラー処理用)
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

// テンプレートをレンダリングするために必要
from django.template.response import TemplateResponse

// Productオブジェクトをインポート
from catalogue.models import Product


def product_list(request):
    """ 商品一覧画面
    """ 
    products = Product.objects.order_by('name')
    
    # プロダクトリストを5個ずつ表示
    paginator = Paginator(products, 5)

    # request.GETにクエリパラメーターが入っている
    # getで'page'属性のクエリの値を取得、なければ1を代入
    page = request.GET.get('page', 1)

    # 存在するページ数であるか判断
    # あればそのページのプロダクトリストを代入
    # 空のリクエストや存在しないページのリクエスト時は1ページ目のリストを代入
    try:
        products = paginator.page(page)
    except (EmptyPage, PageNotAnInteger):
        products = paginator.page(1)

    # リクエストを返す
    return TemplateResponse(request, 'catalogue/product_list.html',
                            {'products': products})

 

product_list.html

{% block title %}商品一覧{% endblock %}

{% block content %}
  <ul>
    # プロダクトリストの表示
    {% for product in products %}
      <li><a href="{% url 'product_detail' product.id %}">{{ product.name }}</a>: {{ product.price }}円</li>
    {% endfor %}
  </ul>

  # ページネーションのリンク表示(前ページがあればリンクを表示)
  {% if products.has_previous %}
    # クエリパラメータをつけたaタグを作成
    <a href="?page={{ products.previous_page_number }}">&lt; 前ページ</a>
  {% else %}
    <span>&lt; 前ページ</span>
  {% endif %}

  # 現在表示されているベージ
  {{ products.number }}ページ

  # 次ページへのリンク表示
  {% if products.has_next %}
    # クエリパラメータをつけたaタグを作成
    <a href="?page={{ products.next_page_number }}">次ページ &gt;</a>
  {% else %}
    <span>次ページ &gt;</span>
  {% endif %}
{% endblock %}

 

paginatorはとにかく、

// paginatorをインポート(EmptyPage, PageNotAnIntegerはエラー処理用)
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

インポートして、

products = Product.objects.order_by('name')
paginator = Paginator(products, 5)

リストと表示数を引数にとって、

page = request.GET.get('page', 1)

pageパラメータが来たときに値を拾えるようにし、

try:
    products = paginator.page(page)
except (EmptyPage, PageNotAnInteger):
    products = paginator.page(1)

エラー処理をして、

return TemplateResponse(request, 'catalogue/product_list.html',
                        {'products': products})

リクエストを返す。

 

テンプレート側では

// 前ページがあればTrue
products.has_previous
// 前ページの番号
products.previous_page_number
// 次ページがあればTrue
products.has_next
// 次ページの番号
products.next_page_number
// 表示されているページ番号
products.number

これらページネーションのメソッドと属性を使って表示させます。

 

まとめ

ある人間が、別のある人間のことを「この人すごいな」と感じる瞬間というのは、「その人のやったことが自分にできるか否か」で判定される。これは当たり前のことすぎて文章として書かれない。学校でも特段教わることは無い。「腹が減ったから、ご飯を食べる」という因果関係と近く、至極普通であり生物の本能的なものと言える。全国1位を取った人が関東大会出場者をすごいとは思わないだろうし、東大に現役合格した人が浪人東大生をすごいとは思わないだろう。しかし、どれほど世間一般に見てすごいことを成し遂げた人であろうとも、YouTubeで自分の排泄物をチョコレートに模して型取り、女の子にプレゼントする動画を投稿した人のことをすごいと思うかもしれない。ものごとの難易度は人それぞれであり、誰が誰のことをすごいと思うかは千差万別である。「すごい」に限らず、「かっこいい」とか「かわいい」とか、全ての「価値あるものごと」というのは、千差万別な個人の感情で成立するという考えが僕にはある。それぞれが自分の経験から判断し、考えを持ってものごとに価値をつけている。価値がつくまでの経過は途方もなく複雑なのである。であるのにもかかわらず、「ターゲットを絞り顧客のニーズを判断してこのチャネルでプッシュしたから成功した」のような、あたかも僕は人間の感情全てを把握し支配して価値を作り物を売ったんだよ、みたいな表現がマーケティングの勉強をしていると多発する。個人的にこのようなマーケティングのしたり顔表現が嫌いである。言葉の節々に「消費者<マーケティング」の構図を感じる。ターゲットとかパトロンとかロイヤリティとか、日本語にしたら「標的」とか「後援者」とか「忠誠心」な訳であり、マーケティング用語は偉そうである。個人的には譲歩しても対等な関係だと思う。何なら「消費者>マーケティング」であっていい。商品は消費者に買っていただいている、お客さま第一と口では言っておいて営業はお客さまのことを第一には考えていない訳であり(独断)、それを学問として説いているなら納得するが決してそう言うわけでも無いと思う。カスタマーロイヤルティとか言って偉そうに語るなら、サプライヤーロイヤルティみたいな言葉も作ってマーケティング論の教科書に載せて欲しい。この考えは偏見が過ぎると自分でも思うが、ずっと思っていたことなのでここで書いてみた。自己表現である。自己表現とは便利な言葉だ。

以上ありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA