Published Date : 2019年3月28日0:35
from django.core.paginator import Paginator
from django.db import models class Post(models.Model): title=models.CharField(max_length=100) published=models.DateTimeField() image = models.ImageField(upload_to='media/') body = models.TextField()この設計図をもとに作られたデータを データベースから取り出すと、
posts=Post.objects.all()
print(posts) -> [ {'id':1,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'}, {'id':2,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'}, {'id':3,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'} ]
p = Paginator(posts, 2)
p.count -> 3
p.num_pages -> 2
p.page_range -> range(1, 3)
p.page_range -> range(1, 3) for page in p.page_range: -> for page in range(1,3): print(page) -> 1 -> 2
page1 = p.page(1) page1 -> ページ 2個 あるうちの 1個目
page1.object_list -> [ {'id':1,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'}, {'id':2,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'} ]
page1.has_next() -> True
page1.has_previous() -> False
page2 = p.page(2)
page2.has_other_pages() -> True次のページの番号は? エラーが返される。
page2.next_page_number() -> Traceback (most recent call last): ... EmptyPage: That page contains no results
page2.previous_page_number() -> 1
page1.start_index() -> 1
page2.start_index() -> 3
page2.end_index() -> 3
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
posts=Post.objects.all() paginator = Paginator(posts, 1)
try: page = paginator.page(post_id)
except PageNotAnInteger: page = paginator.page(1) except EmptyPage: page = paginator.page(paginator.num_pages)
return render(request,'posts/post.html',{'post':post,'post_body':post_body,'page':page})
{% include 'posts/pagination.html' %}
<nav aria-label="Page navigation example"> <ul class="pagination justify-content-center"> <li class="page-item disabled"> <a class="page-link" href="#" tabindex="-1">Previous</a> </li> <li class="page-item"><a class="page-link" href="#">1</a></li> <li class="page-item"><a class="page-link" href="#">2</a></li> <li class="page-item"><a class="page-link" href="#">3</a></li> <li class="page-item"> <a class="page-link" href="#">Next</a> </li> </ul> </nav>
<nav aria-label="Page navigation example"> <ul class="pagination justify-content-center"> {% if page.has_previous %} <li class="page-item"><a class="page-link" href="{{ page.previous_page_number }}>前へ</a></li> {% else %} <li class="page-item disabled"><span></span></li> {% endif %} </ul> </nav>
{% if page.has_previous %}
href="{{ page.previous_page_number }}"
http://あなたのドメイン名/posts/ページ番号
href="{% url 'post' post.id %}"
{% else %} <li class="page-item disabled"><span></span></li>
page-item disabled page-item active
{% endif %}
<nav aria-label="Page navigation example"> <ul class="pagination justify-content-center"> {% if page.has_previous %} <li class="page-item"><a class="page-link" href="{{ page.previous_page_number }}>前へ</a></li> {% else %} <li class="page-item disabled"><span></span></li> {% endif %} どんどん付け足していこう。 {% for i in page.paginator.page_range %} {% if page.number == i %} <li class="page-item active"> <span class="page-link">{{ i }} <span class="sr-only">(current) </span></span></li> {% else %} <li class="page-item"> <a class="page-link" href="{{ i }}">{{ i }}</a></li> {% endif %} {% endfor %} </ul> </nav>
{% for i in page.paginator.page_range %} {% if page.number == i %} {% else %} {% endif %} {% endfor %}
{% if page.number == i %} アクティブにして、 現在表示中のページ番号だとわかるようにする。 <li class="page-item active"> <span class="page-link">{{ i }} <span class="sr-only">(current) </span></span></li> sr-onlyは、Screen Reader Only の略。 簡単に雑に話すと、 目が不自由な方々への配慮です。 音声ソフト(スクリーンリーダー)が このページネーションの場所は(current)だよ と音声で読み上げてくれる。 画面上からは見えない。
もしそうでないなら {% else %} ページ番号を表示。 <li class="page-item"> <a class="page-link" href="{{ i }}">{{ i }}</a></li> リンク先も番号(記事のID番号と同じ)にする。 IF文終了 {% endif %} FOR文終了 {% endfor %}
もし、次のページがあるなら、 {% if page.has_next %} 次のページのリンク先をつけて「次へ」を表示。 <li class="page-item"> <a class="page-link" href="{{ page.next_page_number }}">次へ</a></li> そうではないなら、 {% else %} 空っぽの表示。 <li class="page-item disabled"> <span></span></li> IF文終了。 {% endif %}
<nav aria-label="Page navigation example"> <ul class="pagination justify-content-center"> 前への処理。 {% if page.has_previous %} <li class="page-item"><a class="page-link" href="{{ page.previous_page_number }}>前へ</a></li> {% else %} <li class="page-item disabled"><span></span></li> {% endif %} ページの番号表示とリンクへ飛ばす処理。 {% for i in page.paginator.page_range %} {% if page.number == i %} <li class="page-item active"> <span class="page-link">{{ i }} <span class="sr-only">(current) </span></span></li> {% else %} <li class="page-item"> <a class="page-link" href="{{ i }}">{{ i }}</a></li> {% endif %} {% endfor %} 次への処理。 {% if page.has_next %} <li class="page-item"> <a class="page-link" href="{{ page.next_page_number }}">次へ</a></li> {% else %} <li class="page-item disabled"> <span></span></li> {% endif %} </ul> </nav>
python manage.py runserver
localhost:8000/posts